From be6d941b90f6702a3f25fff65214e1dcc672b28b Mon Sep 17 00:00:00 2001 From: pan Date: Mon, 21 Sep 2026 15:25:02 +0800 Subject: [PATCH] feat(skill): add trigger probability and pity system for attack/attacked triggers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增技能触发概率配置与保底叠加机制,仅对攻击/受击触发生效 2. 前端编辑器新增t_chance概率与pity_add保底增量配置项 3. 技能描述文案支持展示触发概率 4. 运行时新增概率判定与保底缓存逻辑,兼容存量配置 --- assets/script/game/common/HeroSkillText.ts | 12 +- assets/script/game/common/config/heroSet.ts | 329 +++++++++++------- assets/script/game/hero/HeroAttrsComp.ts | 23 +- assets/script/game/hero/SkillTriggerHelper.ts | 33 +- put/web/src/components/TriggerGroupEditor.vue | 16 +- 5 files changed, 261 insertions(+), 152 deletions(-) diff --git a/assets/script/game/common/HeroSkillText.ts b/assets/script/game/common/HeroSkillText.ts index 3fe94813..67106b5e 100644 --- a/assets/script/game/common/HeroSkillText.ts +++ b/assets/script/game/common/HeroSkillText.ts @@ -81,11 +81,13 @@ const PLACEHOLDER_PATTERN = /\{(\w+)\}/g; * atking/atked 为周期循环触发(运行时按次数取模判定),拼为"每攻击N次"/"每受击N次" * 表达循环语义(N=1 时退化为"每次攻击"/"每次受击");其余类型直接用触发名(召唤/死亡后/回合开始)。 */ -function buildTriggerLabel(type: SkillTriggerType, tNum: number): string { +function buildTriggerLabel(type: SkillTriggerType, tNum: number, chance?: number): string { if (type === SkillTriggerType.Atking || type === SkillTriggerType.Atked) { + // 配置了 t_chance 且 < 100 时追加概率说明(保底叠加为隐藏机制,不在文案展示) + const chanceSeg = chance !== undefined && chance < 100 ? `(${valueRich(Math.round(chance))}%概率)` : ""; return tNum <= 1 - ? `每次${SkillTriggerName[type]}` - : `每${SkillTriggerName[type]}${valueRich(tNum)}次`; + ? `每次${SkillTriggerName[type]}${chanceSeg}` + : `每${SkillTriggerName[type]}${valueRich(tNum)}次${chanceSeg}`; } return SkillTriggerName[type]; } @@ -226,7 +228,7 @@ export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true, s tmpl = tmpl ?? entries[0]?.desc; const text = tmpl ? renderDesc(tmpl, skill) : fallbackDesc(skill); // 触发语境:"每攻击N次"循环语义(buildTriggerLabel),逗号衔接效果文本 - const trig = buildTriggerLabel(type, item.t_num); + const trig = buildTriggerLabel(type, item.t_num, item.t_chance); parts.push(`${trig}, ${text}`); } // dead 组内的复活效果(revive_hp / revive_count)并入同一行 @@ -499,7 +501,7 @@ function collectTriggerTiers(hero: heroInfo, type: SkillTriggerType, skillUuid: tNum: e.t_num, }; }); - const label = buildTriggerLabel(type, sorted[0].t_num); + const label = buildTriggerLabel(type, sorted[0].t_num, sorted[0].t_chance); return { tiers, label }; } diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index ce69a9e2..ab63a15d 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -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" @@ -424,8 +424,8 @@ export interface heroInfo { [SkillTriggerType.FStart]?: TriggerGrouped; // 战斗开始时释放的技能配置 [SkillTriggerType.FEnd]?: TriggerGrouped; // 回合结束时释放的技能配置 [SkillTriggerType.Field]?: LvFieldEntry[]; // 驻场光环(按 lv 升序,运行时取 ≤英雄等级 的最大档) - [SkillTriggerType.Atking]?: TriggerGrouped; // 普通攻击后触发的技能配置,s_uuid: 技能id, t_num: 触发所需的普攻次数 - [SkillTriggerType.Atked]?: TriggerGrouped; // 受击后触发的技能配置,s_uuid: 技能id, t_num: 触发所需的受击次数 + [SkillTriggerType.Atking]?: TriggerGrouped; // 普通攻击后触发的技能配置,s_uuid: 技能id, t_num: 触发所需的普攻次数, t_chance: 触发概率(%),pity_add: 未触发时下次概率增量 + [SkillTriggerType.Atked]?: TriggerGrouped; // 受击后触发的技能配置,s_uuid: 技能id, t_num: 触发所需的受击次数, t_chance: 触发概率(%),pity_add: 未触发时下次概率增量 dis?: number; // 攻击距离(像素) speed?: number; // 移动速度(像素/秒) dodge?: number; // 闪避率(百分点,缺省由初始化处兜底为全局默认值) @@ -504,6 +504,11 @@ export interface LvTriggerEntry { s_lv?: SkillLv; // 此档对应的技能等级(标注用,便于面板显示"技能Lv.x") name?: string; // 该 s_uuid 触发技能组的对外展示名(写在第 1 档,作为组名) t_num: number; + /** 触发概率(百分点 0~100,缺省 100 必触发;仅 Atking/Atked 攻受击触发生效) */ + t_chance?: number; + /** 保底叠加:判定未触发时,为该 s_uuid 累积下次概率增量(百分点)。 + * 缺省/0 = 不叠加;触发成功后清零,最终概率封顶 100 */ + pity_add?: number; overrides?: SkillOverrides; /** 此档描述模板:缺省回退该组第 1 档 desc;由 HeroSkillText 渲染合并后实时数值。 * 显式配置后弹窗提升档(slv2+)直接展示该模板渲染结果,优先于自动 diff */ @@ -516,6 +521,20 @@ export interface LvTriggerEntry { */ export type TriggerGrouped = Record; +/** + * 运行时生效的触发条目(resolveTriggerByLv 产出): + * 每个 s_uuid 取 ≤lv 最大档的扁平结果,供触发器/评分/文案消费。 + */ +export interface ResolvedTriggerEntry { + s_uuid: number; + t_num: number; + /** 触发概率(百分点,缺省 100 必触发;仅 Atking/Atked 生效) */ + t_chance?: number; + /** 保底叠加:未触发时累积的下次概率增量(百分点,触发成功后清零) */ + pity_add?: number; + overrides?: SkillOverrides; +} + /** * 驻场光环词条:uuid 指向 FieldSkillSet 底座(类型/图标/元数据), * value 为该词条实际生效数值(由配置处按档位指定,不再随 uuid 分档)。 @@ -572,25 +591,27 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "挥剑对{target}造成攻击力{ap}%伤害", + 6004: { + uuid: 6004, name: "强化普攻", 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}, desc: "普通攻击 造成 120% 伤害" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 }, desc: "普通攻击 造成 120% 伤害" }, ], }, - 6301: { uuid: 6301, name: "魔法盾", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: {"ap":30}, desc: "{target}获得生命最大值{ap}%的护盾", + 6301: { + uuid: 6301, name: "魔法盾", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: { "ap": 30 }, desc: "{target}获得生命最大值{ap}%的护盾", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":60}, desc: "{target}获得生命最大值{ap}%的护盾" }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":120}, desc: "{target}获得生命最大值{ap}%的护盾" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 60 }, desc: "{target}获得生命最大值{ap}%的护盾" }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 120 }, desc: "{target}获得生命最大值{ap}%的护盾" }, ], }, }, atked: { 6301: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: {"TGroup":null,"ap":10,"icon":"Stat_UnitSummonIncrease_01"}, desc: "全队获得本英雄生命最大值{ap}%的护盾" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: { "TGroup": null, "ap": 10, "icon": "Stat_UnitSummonIncrease_01" }, desc: "全队获得本英雄生命最大值{ap}%的护盾" }, ], }, bonus: [ - { lv: 12, attrs: {"def":50}, name: "钢铁壁垒", icon: "46-Iron-Clad", }, + { lv: 12, attrs: { "def": 50 }, name: "钢铁壁垒", icon: "46-Iron-Clad", }, ], info: "自身强护盾+群体小护盾,强生存", }, @@ -598,25 +619,27 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "对{target}造成攻击力{ap}%伤害", + 6004: { + uuid: 6004, name: "强化普攻", 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}, desc: "普通攻击造成 120% 攻击伤害" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 }, desc: "普通攻击造成 120% 攻击伤害" }, ], }, - 6101: { uuid: 6101, name: "气斩", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":150,"timed_debuff_id":7002,"icon":"Stat_AttackSpeed_02"}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)", + 6101: { + uuid: 6101, name: "气斩", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 150, "timed_debuff_id": 7002, "icon": "Stat_AttackSpeed_02" }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"buff_value":20} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":180,"bck":60,"buff_value":40}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "buff_value": 20 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 180, "bck": 60, "buff_value": 40 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" }, ], }, }, atking: { 6004: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "风暴打击", t_num: 3, overrides: {"ap":300,"icon":"Stat_AllUnitAttack"}, desc: "立刻打击{target},造成攻击力{ap}%伤害" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "风暴打击", t_num: 3, overrides: { "ap": 300, "icon": "Stat_AllUnitAttack" }, desc: "立刻打击{target},造成攻击力{ap}%伤害" }, ], }, bonus: [ - { lv: 12, attrs: {"hp":50}, name: "不屈战意", icon: "29-Endure", }, + { lv: 12, attrs: { "hp": 50 }, name: "不屈战意", icon: "29-Endure", }, ], info: "易伤+风怒,近战 dps", }, @@ -624,15 +647,17 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "挥斧对{target}造成攻击力{ap}%伤害", + 6004: { + uuid: 6004, name: "强化普攻", 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: "普通攻击有{stun}%概率击晕敌人" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "stun": 10 }, desc: "普通攻击有{stun}%概率击晕敌人" }, ], }, - 6104: { uuid: 6104, name: "开山斧", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":300,"stun":100}, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕", + 6104: { + uuid: 6104, name: "开山斧", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 300, "stun": 100 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":450,"stun":100} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"stun":100} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 450, "stun": 100 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "stun": 100 } }, ], }, }, @@ -640,7 +665,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7005, value: 0.25, name: "大圣神威" }] }, ], bonus: [ - { lv: 12, attrs: {"hp":50}, name: "不屈战意", icon: "29-Endure", }, + { lv: 12, attrs: { "hp": 50 }, name: "不屈战意", icon: "29-Endure", }, ], info: "必晕爆发+暴击光环,近战收割", }, @@ -648,15 +673,17 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "挥刀对{target}造成攻击力{ap}%伤害", + 6002: { + uuid: 6002, name: "强化普攻", 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: "普通攻击有{crt}%概率暴击" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "crt": 10 }, desc: "普通攻击有{crt}%概率暴击" }, ], }, - 6100: { uuid: 6100, name: "光闪", lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: {"ap":150}, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害", + 6100: { + uuid: 6100, name: "光闪", lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: { "ap": 150 }, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350 } }, ], }, }, @@ -664,7 +691,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7004, value: 0.12, name: "剑刃风暴" }, { uuid: 7005, value: 0.2, name: "斩魂利刃" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "致命本能", icon: "36-Guardian-Stance", }, + { lv: 12, attrs: { "ap": 50 }, name: "致命本能", icon: "36-Guardian-Stance", }, ], info: "暴击+暴伤双光环,暴击流刺客", }, @@ -672,15 +699,17 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "挥刀对{target}造成攻击力{ap}%伤害", + 6002: { + uuid: 6002, name: "强化普攻", 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_debuff_id":7007,"debuff_value":30,"debuff_chance":30}, desc: "普通攻击有{debuff_chance}%概率使目标出血(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_debuff_id": 7007, "debuff_value": 30, "debuff_chance": 30 }, desc: "普通攻击有{debuff_chance}%概率使目标出血(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, ], }, - 6103: { uuid: 6103, name: "闪电斩", lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: {"ap":150}, desc: "高速斩击{target},造成攻击力{ap}%伤害", + 6103: { + uuid: 6103, name: "闪电斩", lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: { "ap": 150 }, desc: "高速斩击{target},造成攻击力{ap}%伤害", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"timed_debuff_id":7007,"debuff_value":40}, desc: "高速斩击{target},造成攻击力{ap}%,并使目标出血(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"timed_debuff_id":7007,"debuff_value":60}, desc: "高速斩击{target},造成攻击力{ap}%,附带 50% 概率麻痹,并使目标出血(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "timed_debuff_id": 7007, "debuff_value": 40 }, desc: "高速斩击{target},造成攻击力{ap}%,并使目标出血(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "timed_debuff_id": 7007, "debuff_value": 60 }, desc: "高速斩击{target},造成攻击力{ap}%,附带 50% 概率麻痹,并使目标出血(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, ], }, }, @@ -688,7 +717,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7002, value: 10, name: "攻击光环" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "致命本能", icon: "36-Guardian-Stance", }, + { lv: 12, attrs: { "ap": 50 }, name: "致命本能", icon: "36-Guardian-Stance", }, ], info: "普攻出血+大招群体出血,持续消耗", }, @@ -696,15 +725,17 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害", + 6006: { + uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"frz":10}, desc: "普通攻击有{frz}%概率 冰冻敌人" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "frz": 10 }, desc: "普通攻击有{frz}%概率 冰冻敌人" }, ], }, - 6150: { uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":150,"frz":30,"icon":"Stat_AttackRangeIncrease_02"}, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻", + 6150: { + uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 150, "frz": 30, "icon": "Stat_AttackRangeIncrease_02" }, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200,"frz":50} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"frz":70} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200, "frz": 50 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "frz": 70 } }, ], }, }, @@ -712,7 +743,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7006, value: 0.15 }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "鹰眼锁定", icon: "27-Hawkeye", }, + { lv: 12, attrs: { "ap": 50 }, name: "鹰眼锁定", icon: "27-Hawkeye", }, ], info: "冰冻控场+多重箭,远程控制", }, @@ -720,15 +751,17 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害", + 6010: { + uuid: 6010, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck_chance":20}, desc: "普通攻击有{bck_chance}%概率击退敌人" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "bck_chance": 20 }, desc: "普通攻击有{bck_chance}%概率击退敌人" }, ], }, - 6200: { uuid: 6200, name: "火焰喷射", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":250,"bck":100}, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}", + 6200: { + uuid: 6200, name: "火焰喷射", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 250, "bck": 100 }, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":350,"bck":100} }, - { 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 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "bck": 100, "summon_count": 2 } }, ], }, }, @@ -736,7 +769,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7002, value: 0.15, name: "深渊威压" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "奥术共鸣", icon: "100-Enchant-Magic", }, + { lv: 12, attrs: { "ap": 50 }, name: "奥术共鸣", icon: "100-Enchant-Magic", }, ], info: "烈焰击退+易伤光环,法系压场", }, @@ -744,25 +777,27 @@ export const HeroInfo: Record = { 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, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "挥杖对{target}造成攻击力{ap}%伤害", + 6011: { + uuid: 6011, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥杖对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120}, desc: "普通攻击造成 120% 攻击伤害" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 }, desc: "普通攻击造成 120% 攻击伤害" }, ], }, - 6302: { uuid: 6302, name: "治疗", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: {"ap":30}, desc: "为{target}回复攻击力{ap}%生命", + 6302: { + uuid: 6302, name: "治疗", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: { "ap": 30 }, desc: "为{target}回复攻击力{ap}%生命", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":40} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":50} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 40 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 50 } }, ], }, }, atking: { 6301: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: {"ap":30}, desc: "{target}获得生命最大值{ap}%的护盾" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: { "ap": 30 }, desc: "{target}获得生命最大值{ap}%的护盾" }, ], }, bonus: [ - { lv: 12, attrs: {"hp":50}, name: "守护之心", icon: "29-Endure", }, + { lv: 12, attrs: { "hp": 50 }, name: "守护之心", icon: "29-Endure", }, ], info: "全体治疗+攻击附盾,团队续航", }, @@ -770,25 +805,27 @@ export const HeroInfo: Record = { 5009: { uuid: 5009, name: "甲虫领主", path: "hk2", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, skills: { - 6004: { uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, + 6004: { + uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"proc_skill":{"s_uuid":6502,"chance":10,"overrides":{"ap":5,"TGroup": TGroup.Self}}}, desc: "普通攻击有 10% 的概率为自己释放回春(5 秒恢复生命值的{ap}%)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "proc_skill": { "s_uuid": 6502, "chance": 10, "overrides": { "ap": 5, "TGroup": TGroup.Self } } }, desc: "普通攻击有 10% 的概率为自己释放回春(5 秒恢复生命值的{ap}%)" }, ], }, - 6102: { uuid: 6102, lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":250,"bck":30}, + 6102: { + uuid: 6102, lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 250, "bck": 30 }, lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":300,"bck":50} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"bck":70} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 300, "bck": 50 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "bck": 70 } }, ], }, }, atked: { 6302: [ - { lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: {"ap":5}, desc: "为自己释放治疗,恢复生命值的{ap}%" }, + { lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: { "ap": 5 }, desc: "为自己释放治疗,恢复生命值的{ap}%" }, ], }, bonus: [ - { lv: 12, attrs: {"def":50}, name: "钢铁壁垒", icon: "46-Iron-Clad", }, + { lv: 12, attrs: { "def": 50 }, name: "钢铁壁垒", icon: "46-Iron-Clad", }, ], info: "受击自疗+击退,自愈坦克", }, @@ -796,25 +833,27 @@ export const HeroInfo: Record = { 5010: { uuid: 5010, name: "火箭哥", path: "ha2", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, skills: { - 6006: { uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, + 6006: { + uuid: 6006, name: "强化普攻", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":100,"bck_chance":10} }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 100, "bck_chance": 10 } }, ], }, - 6151: { uuid: 6151, lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: {"ap":70,"summon_count":5,"bck_chance":100}, + 6151: { + uuid: 6151, lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: { "ap": 70, "summon_count": 5, "bck_chance": 100 }, lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":80,"summon_count":5,"bck_chance":100} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"bck_chance":100,"ap":100,"summon_count":6} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 80, "summon_count": 5, "bck_chance": 100 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "bck_chance": 100, "ap": 100, "summon_count": 6 } }, ], }, }, atking: { 6008: [ - { lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: {"ap":120,"bck_chance":50} }, + { lv: 4, s_lv: SkillLv.Lv1, t_num: 3, overrides: { "ap": 120, "bck_chance": 50 } }, ], }, bonus: [ - { lv: 12, attrs: {"ap":50}, name: "鹰眼锁定", icon: "27-Hawkeye", }, + { lv: 12, attrs: { "ap": 50 }, name: "鹰眼锁定", icon: "27-Hawkeye", }, ], info: "万箭齐射+高频击退,远程压制", }, @@ -822,25 +861,27 @@ export const HeroInfo: Record = { 5011: { uuid: 5011, name: "控血大师", path: "hk3", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, skills: { - 6004: { uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, + 6004: { + uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"proc_skill":{"s_uuid":6502,"chance":10,"overrides":{"ap":5}}}, desc: "普攻有 10% 概率,对自己释放回春(5 秒回复5% 生命)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "proc_skill": { "s_uuid": 6502, "chance": 10, "overrides": { "ap": 5 } } }, desc: "普攻有 10% 概率,对自己释放回春(5 秒回复5% 生命)" }, ], }, - 6517: { uuid: 6517, name: "生命爆发", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: {"buff_value":30,"buff_duration":10}, desc: "全体友方最大生命值提升{buff_value}%,持续{dur}秒", + 6517: { + uuid: 6517, name: "生命爆发", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: { "buff_value": 30, "buff_duration": 10 }, desc: "全体友方最大生命值提升{buff_value}%,持续{dur}秒", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"buff_value":40,"buff_duration":10}, desc: "全体友方最大生命值提升{buff_value}%,持续{dur}秒" }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"buff_value":50,"buff_duration":15}, desc: "全体友方最大生命值提升{buff_value}%,持续{dur}秒" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "buff_value": 40, "buff_duration": 10 }, desc: "全体友方最大生命值提升{buff_value}%,持续{dur}秒" }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "buff_value": 50, "buff_duration": 15 }, desc: "全体友方最大生命值提升{buff_value}%,持续{dur}秒" }, ], }, }, atked: { 6402: [ - { lv: 4, s_lv: SkillLv.Lv1, t_num: 5, overrides: {"ap":1,"TGroup": TGroup.Ally,"hit_count":3}, desc: "全队永久增加 1% 生命最大值" }, + { lv: 4, s_lv: SkillLv.Lv1, t_num: 5, overrides: { "ap": 1, "TGroup": TGroup.Ally, "hit_count": 3 }, desc: "全队永久增加 1% 生命最大值" }, ], }, bonus: [ - { lv: 12, attrs: {"def":50}, name: "钢铁壁垒", icon: "46-Iron-Clad", }, + { lv: 12, attrs: { "def": 50 }, name: "钢铁壁垒", icon: "46-Iron-Clad", }, ], info: "永久和计时生命最大值,控血大师", }, @@ -848,15 +889,17 @@ export const HeroInfo: Record = { 5012: { uuid: 5012, name: "疾风法师", path: "hm2", fac: FacSet.HERO, rarity: 1, 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, def: HERO_ROLE_BASE[HRole.Mage].def, skills: { - 6009: { uuid: 6009, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, + 6009: { + uuid: 6009, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"proc_skill":{"s_uuid":6507,"chance":10,"overrides":{"buff_value":30,"TGroup": TGroup.Self}}} }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "proc_skill": { "s_uuid": 6507, "chance": 10, "overrides": { "buff_value": 30, "TGroup": TGroup.Self } } } }, ], }, - 6201: { uuid: 6201, name: "飓风", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":100,"summon_count":2,"proc_skill":{"s_uuid":6507,"chance":20,"overrides":{"buff_value":20}}}, desc: "召唤 {summon_count} 道飓风攻击前方敌人,每道飓风造成 {ap}%伤害,每道飓风释放时有20% 概率增加全体队友20% 攻速", + 6201: { + uuid: 6201, name: "飓风", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 100, "summon_count": 2, "proc_skill": { "s_uuid": 6507, "chance": 20, "overrides": { "buff_value": 20 } } }, desc: "召唤 {summon_count} 道飓风攻击前方敌人,每道飓风造成 {ap}%伤害,每道飓风释放时有20% 概率增加全体队友20% 攻速", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":100,"summon_count":3,"proc_skill":{"s_uuid":6507,"chance":20,"overrides":{"buff_value":20}}}, desc: "召唤 {summon_count} 道飓风攻击前方敌人,每道飓风造成 {ap}%伤害,每道飓风释放时有20% 概率增加全体队友20% 攻速" }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":100,"summon_count":4,"proc_skill":{"s_uuid":6507,"chance":20,"overrides":{"buff_value":20}}}, desc: "召唤 {summon_count} 道飓风攻击前方敌人,每道飓风造成 {ap}%伤害,每道飓风释放时有20% 概率增加全体队友20% 攻速" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 100, "summon_count": 3, "proc_skill": { "s_uuid": 6507, "chance": 20, "overrides": { "buff_value": 20 } } }, desc: "召唤 {summon_count} 道飓风攻击前方敌人,每道飓风造成 {ap}%伤害,每道飓风释放时有20% 概率增加全体队友20% 攻速" }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 100, "summon_count": 4, "proc_skill": { "s_uuid": 6507, "chance": 20, "overrides": { "buff_value": 20 } } }, desc: "召唤 {summon_count} 道飓风攻击前方敌人,每道飓风造成 {ap}%伤害,每道飓风释放时有20% 概率增加全体队友20% 攻速" }, ], }, }, @@ -864,7 +907,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7006, value: 10 }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "奥术共鸣", icon: "100-Enchant-Magic", }, + { lv: 12, attrs: { "ap": 50 }, name: "奥术共鸣", icon: "100-Enchant-Magic", }, ], info: "普攻 大招加速 buff+加速光环,加速大师", }, @@ -872,25 +915,27 @@ export const HeroInfo: Record = { 5013: { uuid: 5013, name: "反伤哥", path: "hh2", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, + 6004: { + uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"timed_buff_id":7029,"buff_value":10,"buff_chance":20} }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_buff_id": 7029, "buff_value": 10, "buff_chance": 20 } }, ], }, - 6515: { uuid: 6515, name: "荆棘护盾", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: {"buff_value":20,"TGroup": TGroup.Ally,"hit_count":3,"buff_duration":5}, + 6515: { + uuid: 6515, name: "荆棘护盾", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: { "buff_value": 20, "TGroup": TGroup.Ally, "hit_count": 3, "buff_duration": 5 }, lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"buff_value":25,"TGroup": TGroup.Ally,"hit_count":3,"buff_duration":10} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"buff_value":30,"buff_duration":10,"hit_count":3,"TGroup": TGroup.Ally} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "buff_value": 25, "TGroup": TGroup.Ally, "hit_count": 3, "buff_duration": 10 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "buff_value": 30, "buff_duration": 10, "hit_count": 3, "TGroup": TGroup.Ally } }, ], }, }, fstart: { 6301: [ - { lv: 4, s_lv: SkillLv.Lv1, t_num: 1, overrides: {"ap":20} }, + { lv: 4, s_lv: SkillLv.Lv1, t_num: 1, overrides: { "ap": 20 } }, ], }, bonus: [ - { lv: 12, attrs: {"hp":50}, name: "守护之心", icon: "29-Endure", }, + { lv: 12, attrs: { "hp": 50 }, name: "守护之心", icon: "29-Endure", }, ], info: "大招全体反伤 普攻暴击 暴击反伤辅助", }, @@ -898,15 +943,17 @@ export const HeroInfo: Record = { 5014: { uuid: 5014, name: "闪避哥", path: "hk4", fac: FacSet.HERO, rarity: 1, 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, def: HERO_ROLE_BASE[HRole.Warrior].def, skills: { - 6004: { uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, + 6004: { + uuid: 6004, name: "普攻强化", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"timed_buff_id":7030,"buff_value":10,"buff_chance":20} }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_buff_id": 7030, "buff_value": 10, "buff_chance": 20 } }, ], }, - 6100: { uuid: 6100, name: "寒冰斩", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":200,"timed_buff_id":7030,"buff_value":50}, + 6100: { + uuid: 6100, name: "寒冰斩", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 200, "timed_buff_id": 7030, "buff_value": 50 }, lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"timed_buff_id":7030,"buff_value":50} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"timed_buff_id":7030,"buff_value":80} }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "timed_buff_id": 7030, "buff_value": 50 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "timed_buff_id": 7030, "buff_value": 80 } }, ], }, }, @@ -914,7 +961,7 @@ export const HeroInfo: Record = { { lv: 4, uuids: [{ uuid: 7023, value: 10 }] }, ], bonus: [ - { lv: 12, attrs: {"hp":50}, name: "不屈战意", icon: "29-Endure", }, + { lv: 12, attrs: { "hp": 50 }, name: "不屈战意", icon: "29-Endure", }, ], info: "", }, @@ -922,28 +969,30 @@ export const HeroInfo: Record = { 5015: { uuid: 5015, name: "毒箭猎手", path: "ha3", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp + 10, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, skills: { - 6007: { uuid: 6007, name: "淬毒箭", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害", + 6007: { + uuid: 6007, name: "淬毒箭", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"timed_debuff_id":7005,"debuff_value":30,"debuff_chance":30}, desc: "普通攻击有{debuff_chance}%概率使目标中毒(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_debuff_id": 7005, "debuff_value": 30, "debuff_chance": 30 }, desc: "普通攻击有{debuff_chance}%概率使目标中毒(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, ], }, - 6150: { uuid: 6150, name: "万箭齐发·毒", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":150,"timed_debuff_id":7005,"debuff_value":30,"debuff_chance":50,"icon":"4-Apply-Poison"}, desc: "毒箭如雨,对{target}造成攻击力{ap}%伤害,{debuff_chance}%概率使目标中毒(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)", + 6150: { + uuid: 6150, name: "万箭齐发·毒", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 150, "timed_debuff_id": 7005, "debuff_value": 30, "debuff_chance": 50, "icon": "4-Apply-Poison" }, desc: "毒箭如雨,对{target}造成攻击力{ap}%伤害,{debuff_chance}%概率使目标中毒(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200,"buff_value":40,"buff_chance":60} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"buff_value":60,"buff_chance":80,"hit_count":2}, desc: "毒箭如雨,对{target}造成攻击力{ap}%伤害,{buff_chance}%概率使目标中毒(每0.5秒受到{buff_value}点伤害,持续{dur}秒),每支箭可命中{hit_count}个目标" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200, "buff_value": 40, "buff_chance": 60 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "buff_value": 60, "buff_chance": 80, "hit_count": 2 }, desc: "毒箭如雨,对{target}造成攻击力{ap}%伤害,{buff_chance}%概率使目标中毒(每0.5秒受到{buff_value}点伤害,持续{dur}秒),每支箭可命中{hit_count}个目标" }, ], }, }, atking: { 6007: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "蚀骨毒箭", t_num: 3, overrides: {"ap":80,"timed_debuff_id":7005,"debuff_value":40,"debuff_chance":100}, desc: "追加射出蚀骨毒箭,对{target}造成攻击力{ap}%伤害,必定使目标中毒(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "蚀骨毒箭", t_num: 3, overrides: { "ap": 80, "timed_debuff_id": 7005, "debuff_value": 40, "debuff_chance": 100 }, desc: "追加射出蚀骨毒箭,对{target}造成攻击力{ap}%伤害,必定使目标中毒(每0.5秒受到{debuff_value}点伤害,持续{dur}秒)" }, ], }, field: [ { lv: 4, uuids: [{ uuid: 7002, value: 0.1, name: "淬毒磨砺" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "剧毒淬炼", icon: "27-Hawkeye", }, + { lv: 12, attrs: { "ap": 50 }, name: "剧毒淬炼", icon: "27-Hawkeye", }, ], info: "淬毒普攻+毒雨叠层,持续消耗型远程毒C", }, @@ -951,28 +1000,30 @@ export const HeroInfo: Record = { 5016: { uuid: 5016, name: "连珠神射", path: "ha4", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap + 10, def: HERO_ROLE_BASE[HRole.Archer].def, skills: { - 6008: { uuid: 6008, name: "连珠箭", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VeryFast].cd, ccd: 0, overrides: {"ap":100}, desc: "极速连射,对{target}造成攻击力{ap}%伤害", + 6008: { + uuid: 6008, name: "连珠箭", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VeryFast].cd, ccd: 0, overrides: { "ap": 100 }, desc: "极速连射,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"crt":20,"proc_skill":{"s_uuid":6007,"chance":20,"overrides":{"crt":100}}}, desc: "普通攻击暴击率提升{crt}%,并有概率触发连射追箭(必定暴击)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "crt": 20, "proc_skill": { "s_uuid": 6007, "chance": 20, "overrides": { "crt": 100 } } }, desc: "普通攻击暴击率提升{crt}%,并有概率触发连射追箭(必定暴击)" }, ], }, - 6151: { uuid: 6151, name: "裂空箭雨", lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: {"ap":150,"crt":30,"summon_count":5}, desc: "箭雨倾泻,对{target}造成攻击力{ap}%伤害,{crt}%概率暴击", + 6151: { + uuid: 6151, name: "裂空箭雨", lv: 1, cd: UltCdSet[UltCdLv.VeryFast].cd, ccd: 0, overrides: { "ap": 150, "crt": 30, "summon_count": 5 }, desc: "箭雨倾泻,对{target}造成攻击力{ap}%伤害,{crt}%概率暴击", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200,"crt":50} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"crt":70,"summon_count":6,"hit_count":2}, desc: "箭雨倾泻,对{target}造成攻击力{ap}%伤害,{crt}%概率暴击,每支箭可命中{hit_count}个目标" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200, "crt": 50 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "crt": 70, "summon_count": 6, "hit_count": 2 }, desc: "箭雨倾泻,对{target}造成攻击力{ap}%伤害,{crt}%概率暴击,每支箭可命中{hit_count}个目标" }, ], }, }, fstart: { 6504: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "猎杀时刻", t_num: 1, overrides: {"buff_value":30}, desc: "战斗开始时释放暴击爆发,全体友方暴击率提升{buff_value}%,持续{dur}秒" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "猎杀时刻", t_num: 1, overrides: { "buff_value": 30 }, desc: "战斗开始时释放暴击爆发,全体友方暴击率提升{buff_value}%,持续{dur}秒" }, ], }, field: [ { lv: 4, uuids: [{ uuid: 7004, value: 0.15, name: "猎手集结" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "猎杀直觉", icon: "27-Hawkeye", }, + { lv: 12, attrs: { "ap": 50 }, name: "猎杀直觉", icon: "27-Hawkeye", }, ], info: "极速连射+暴击追射+开局团队暴击,爆发型射手主C", }, @@ -980,28 +1031,30 @@ export const HeroInfo: Record = { 5017: { uuid: 5017, name: "碎甲术士", path: "hm3", fac: FacSet.HERO, rarity: 1, 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 + 10, def: HERO_ROLE_BASE[HRole.Mage].def, skills: { - 6012: { uuid: 6012, name: "蚀甲酸瓶", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "掷出酸瓶,对{target}造成攻击力{ap}%伤害", + 6012: { + uuid: 6012, name: "蚀甲酸瓶", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "掷出酸瓶,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"timed_debuff_id":7008,"debuff_chance":30}, desc: "普通攻击有{debuff_chance}%概率使目标破甲(防御降低,持续{dur}秒)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_debuff_id": 7008, "debuff_chance": 30 }, desc: "普通攻击有{debuff_chance}%概率使目标破甲(防御降低,持续{dur}秒)" }, ], }, - 6203: { uuid: 6203, name: "碎甲能量波", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":150,"timed_debuff_id":7008}, desc: "释放碎甲能量波,对{target}造成攻击力{ap}%伤害,并使目标破甲(防御降低,持续{dur}秒)", + 6203: { + uuid: 6203, name: "碎甲能量波", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 150, "timed_debuff_id": 7008 }, desc: "释放碎甲能量波,对{target}造成攻击力{ap}%伤害,并使目标破甲(防御降低,持续{dur}秒)", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200} }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"buff_value":-70}, desc: "释放碎甲能量波,对{target}造成攻击力{ap}%伤害,并使目标破甲加深(防御大幅降低,持续{dur}秒)" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200 } }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "buff_value": -70 }, desc: "释放碎甲能量波,对{target}造成攻击力{ap}%伤害,并使目标破甲加深(防御大幅降低,持续{dur}秒)" }, ], }, }, fstart: { 6012: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "先手蚀甲", t_num: 1, overrides: {"ap":150,"timed_debuff_id":7008}, desc: "战斗开始时掷出蚀甲酸瓶,对{target}造成攻击力{ap}%伤害,并必定使其破甲(防御降低,持续{dur}秒)" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "先手蚀甲", t_num: 1, overrides: { "ap": 150, "timed_debuff_id": 7008 }, desc: "战斗开始时掷出蚀甲酸瓶,对{target}造成攻击力{ap}%伤害,并必定使其破甲(防御降低,持续{dur}秒)" }, ], }, field: [ { lv: 4, uuids: [{ uuid: 7009, value: 0.1, name: "锐矛之赐" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "奥术共鸣", icon: "100-Enchant-Magic", }, + { lv: 12, attrs: { "ap": 50 }, name: "奥术共鸣", icon: "100-Enchant-Magic", }, ], info: "先手破甲+概率蚀甲+穿透光环,物理队核心增伤位", }, @@ -1009,28 +1062,30 @@ export const HeroInfo: Record = { 5018: { uuid: 5018, name: "雷暴领主", path: "hm4", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 10, ap: HERO_ROLE_BASE[HRole.Mage].ap + 20, def: HERO_ROLE_BASE[HRole.Mage].def, skills: { - 6009: { uuid: 6009, name: "雷霆弹", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "掷出雷霆弹,对{target}造成攻击力{ap}%伤害", + 6009: { + uuid: 6009, name: "雷霆弹", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: { "ap": 100 }, desc: "掷出雷霆弹,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"para":15}, desc: "普通攻击有{para}%概率麻痹敌人,减缓其技能冷却恢复" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "para": 15 }, desc: "普通攻击有{para}%概率麻痹敌人,减缓其技能冷却恢复" }, ], }, - 6203: { uuid: 6203, name: "雷霆裂空", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: {"ap":200,"para":40}, desc: "释放雷霆裂空波,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹敌人", + 6203: { + uuid: 6203, name: "雷霆裂空", lv: 1, cd: UltCdSet[UltCdLv.Normal].cd, ccd: 0, overrides: { "ap": 200, "para": 40 }, desc: "释放雷霆裂空波,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹敌人", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"para":60}, desc: "释放雷霆裂空波,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹敌人" }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":300,"para":80,"hit_count":3}, desc: "释放雷霆裂空波,对{target}造成攻击力{ap}%伤害,可多次命中,{para}%概率麻痹敌人" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "para": 60 }, desc: "释放雷霆裂空波,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹敌人" }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 300, "para": 80, "hit_count": 3 }, desc: "释放雷霆裂空波,对{target}造成攻击力{ap}%伤害,可多次命中,{para}%概率麻痹敌人" }, ], }, }, fstart: { 6203: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "雷击先手", t_num: 1, overrides: {"ap":150,"para":30,"icon":"100-Enchant-Magic"}, desc: "战斗开始释放雷击,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹敌人" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "雷击先手", t_num: 1, overrides: { "ap": 150, "para": 30, "icon": "100-Enchant-Magic" }, desc: "战斗开始释放雷击,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹敌人" }, ], }, field: [ { lv: 4, uuids: [{ uuid: 7003, value: 10, name: "雷云领域" }] }, ], bonus: [ - { lv: 12, attrs: {"ap":50}, name: "奥术共鸣", icon: "100-Enchant-Magic", }, + { lv: 12, attrs: { "ap": 50 }, name: "奥术共鸣", icon: "100-Enchant-Magic", }, ], info: "雷暴爆发+麻痹控场,法系主C", }, @@ -1038,32 +1093,34 @@ export const HeroInfo: Record = { 5019: { uuid: 5019, name: "圣盾贤者", path: "hm5", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp + 20, ap: HERO_ROLE_BASE[HRole.Mage].ap - 5, def: HERO_ROLE_BASE[HRole.Mage].def + 5, skills: { - 6011: { uuid: 6011, name: "圣光飞瓶", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "掷出圣光飞瓶,对{target}造成攻击力{ap}%伤害", + 6011: { + uuid: 6011, name: "圣光飞瓶", lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "掷出圣光飞瓶,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 2, s_lv: SkillLv.Lv2, overrides: {"proc_skill":{"s_uuid":6516,"chance":20,"overrides":{"timed_buff_id":7028,"buff_value":10}}}, desc: "普通攻击概率凝聚荆棘护体(受击时反弹{buff_value}%所受伤害,持续{dur}秒)" }, + { lv: 2, s_lv: SkillLv.Lv2, overrides: { "proc_skill": { "s_uuid": 6516, "chance": 20, "overrides": { "timed_buff_id": 7028, "buff_value": 10 } } }, desc: "普通攻击概率凝聚荆棘护体(受击时反弹{buff_value}%所受伤害,持续{dur}秒)" }, ], }, - 6301: { uuid: 6301, name: "奥术圣壁", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: {"TGroup": TGroup.Ally,"ap":20,"timed_buff_id":7027,"buff_value":10}, desc: "为全体友方施加生命最大值{ap}%的护盾,并附加荆棘(受击时反弹{buff_value}点伤害,持续{dur}秒)", + 6301: { + uuid: 6301, name: "奥术圣壁", lv: 1, cd: UltCdSet[UltCdLv.VerySlow].cd, ccd: 0, overrides: { "TGroup": TGroup.Ally, "ap": 20, "timed_buff_id": 7027, "buff_value": 10 }, desc: "为全体友方施加生命最大值{ap}%的护盾,并附加荆棘(受击时反弹{buff_value}点伤害,持续{dur}秒)", lv_entries: [ - { lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":30,"buff_value":15}, desc: "为全体友方施加生命最大值{ap}%的护盾,并附加荆棘(受击时反弹{buff_value}点伤害,持续{dur}秒)" }, - { lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":40,"buff_value":20}, desc: "为全体友方施加生命最大值{ap}%的护盾,并附加荆棘(受击时反弹{buff_value}点伤害,持续{dur}秒)" }, + { lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 30, "buff_value": 15 }, desc: "为全体友方施加生命最大值{ap}%的护盾,并附加荆棘(受击时反弹{buff_value}点伤害,持续{dur}秒)" }, + { lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 40, "buff_value": 20 }, desc: "为全体友方施加生命最大值{ap}%的护盾,并附加荆棘(受击时反弹{buff_value}点伤害,持续{dur}秒)" }, ], }, }, atked: { 6516: [ - { lv: 4, s_lv: SkillLv.Lv1, name: "荆棘回应", t_num: 3, overrides: {"timed_buff_id":7028,"buff_value":10,"icon":"75-Shield-Stun"}, desc: "凝聚荆棘护体,受击时反弹{buff_value}%所受伤害,持续{dur}秒" }, + { lv: 4, s_lv: SkillLv.Lv1, name: "荆棘回应", t_num: 3, overrides: { "timed_buff_id": 7028, "buff_value": 10, "icon": "75-Shield-Stun" }, desc: "凝聚荆棘护体,受击时反弹{buff_value}%所受伤害,持续{dur}秒" }, ], }, field: [ { lv: 4, uuids: [{ uuid: 7022, value: 8, name: "荆棘领域" }] }, ], bonus: [ - { lv: 12, attrs: {"hp":50}, name: "守护之心", icon: "29-Endure", }, + { lv: 12, attrs: { "hp": 50 }, name: "守护之心", icon: "29-Endure", }, ], info: "全队护盾+荆棘反伤,生存反击法", }, -// @hero-setup:heroes-end + // @hero-setup:heroes-end /* *=============怪物配置列表================ @@ -1280,9 +1337,9 @@ export const HERO_POWER_WEIGHTS = { * 解析触发技能在目标等级下的有效条目列表。 * 每个 s_uuid 取 ≤lv 的最大档;返回扁平数组供评分/触发器消费。 */ -export function resolveTriggerByLv(grouped: TriggerGrouped | undefined, lv: number): { s_uuid: number; t_num: number; overrides?: SkillOverrides }[] { +export function resolveTriggerByLv(grouped: TriggerGrouped | undefined, lv: number): ResolvedTriggerEntry[] { if (!grouped) return []; - const result: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[] = []; + const result: ResolvedTriggerEntry[] = []; for (const key in grouped) { const entries = grouped[key]; if (!entries || entries.length === 0) continue; @@ -1290,7 +1347,7 @@ export function resolveTriggerByLv(grouped: TriggerGrouped | undefined, lv: numb for (const e of entries) { if (e.lv <= lv && (!pick || e.lv > pick.lv)) pick = e; } - if (pick) result.push({ s_uuid: Number(key), t_num: pick.t_num, overrides: pick.overrides }); + if (pick) result.push({ s_uuid: Number(key), t_num: pick.t_num, t_chance: pick.t_chance, pity_add: pick.pity_add, overrides: pick.overrides }); } return result; } @@ -1595,7 +1652,7 @@ export interface HeroPowerDetailed { /** 计算普通触发类技能(atking/atked/fstart/dead)的详细价值 */ function calcTriggerPowerDetailed( - triggerConfigs: { s_uuid: number, t_num?: number, overrides?: SkillOverrides }[], + triggerConfigs: ResolvedTriggerEntry[], hero: heroInfo, targetLv: number, type: SkillTriggerType, @@ -1636,7 +1693,9 @@ function calcTriggerPowerDetailed( } const triggerCount = getTriggerCount(type, tNum, hero, seconds); - const value = effectValue * triggerCount * scopeMul * weight; + // 期望折算:按基础触发概率缩放(保底叠加提升的是方差体验,不影响长期期望) + const chanceMul = (trig.t_chance ?? 100) / 100; + const value = effectValue * triggerCount * scopeMul * weight * chanceMul; total += value; items.push({ type, s_uuid: trig.s_uuid, name: skill.name, t_num: tNum, value }); } diff --git a/assets/script/game/hero/HeroAttrsComp.ts b/assets/script/game/hero/HeroAttrsComp.ts index 86658418..ae80e06c 100644 --- a/assets/script/game/hero/HeroAttrsComp.ts +++ b/assets/script/game/hero/HeroAttrsComp.ts @@ -1,5 +1,5 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; -import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType, TriggerGrouped, LvFieldEntry, LvBonusAttrsEntry, FieldEntry, HRole } from "../common/config/heroSet"; +import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType, TriggerGrouped, LvFieldEntry, LvBonusAttrsEntry, FieldEntry, HRole, ResolvedTriggerEntry } from "../common/config/heroSet"; import { mLogger } from "../common/Logger"; import { FacSet, FightSet } from "../common/config/GameSet"; import { FieldSkillSet, FieldSkillType, SkillOverrides } from "../common/config/SkillSet"; @@ -64,20 +64,26 @@ export class HeroAttrsComp extends ecs.Comp { // ==================== 运行时解析缓存(按当前等级 resolve 后的有效列表) ==================== /** 当前等级下生效的攻击触发条目(供 SkillTriggerHelper 消费) */ - runtime_atking?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; + runtime_atking?: ResolvedTriggerEntry[]; /** 当前等级下生效的受击触发条目 */ - runtime_atked?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; + runtime_atked?: ResolvedTriggerEntry[]; /** 当前等级下生效的召唤触发条目 */ - runtime_call?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; + runtime_call?: ResolvedTriggerEntry[]; /** 当前等级下生效的死亡触发条目 */ - runtime_dead?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; + runtime_dead?: ResolvedTriggerEntry[]; /** 当前等级下生效的战前触发条目 */ - runtime_fstart?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; + runtime_fstart?: ResolvedTriggerEntry[]; /** 当前等级下生效的回合结束触发条目 */ - runtime_fend?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; + runtime_fend?: ResolvedTriggerEntry[]; /** 当前等级下生效的驻场光环词条列表 */ runtime_field?: FieldEntry[]; + // ==================== 触发概率保底缓存(key: s_uuid, value: 已累积的概率增量百分点) ==================== + /** 攻击触发未命中时累积的下次概率增量(pity_add 驱动,触发成功后清零) */ + pity_atking: Record = {}; + /** 受击触发未命中时累积的下次概率增量(pity_add 驱动,触发成功后清零) */ + pity_atked: Record = {}; + // ==================== 特殊属性 ==================== critical: number = 0; // 暴击率 critical_res: number = 0; // 暴击抗性 @@ -759,6 +765,9 @@ export class HeroAttrsComp extends ecs.Comp { this.runtime_fstart = undefined; this.runtime_fend = undefined; this.runtime_field = undefined; + // 清空触发概率保底叠加缓存 + this.pity_atking = {}; + this.pity_atked = {}; this.critical = 0; this.critical_res = 0; this.dodge = 0; diff --git a/assets/script/game/hero/SkillTriggerHelper.ts b/assets/script/game/hero/SkillTriggerHelper.ts index 028a805f..9f3e7084 100644 --- a/assets/script/game/hero/SkillTriggerHelper.ts +++ b/assets/script/game/hero/SkillTriggerHelper.ts @@ -1,6 +1,6 @@ import { oops } from "db://oops-framework/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; -import { SkillTriggerType } from "../common/config/heroSet"; +import { ResolvedTriggerEntry, SkillTriggerType } from "../common/config/heroSet"; import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroViewComp } from "./HeroViewComp"; import { FacSet } from "../common/config/GameSet"; @@ -118,7 +118,8 @@ export class SkillTriggerHelper { model.runtime_atking.forEach(atkConfig => { // atk_count 代表已进行的普攻次数。当其余数刚好整除配置阈值时触发。 const tNum = Math.max(1, atkConfig.t_num - tNumReduce); - if (model.atk_count > 0 && model.atk_count % tNum === 0) { + if (model.atk_count > 0 && model.atk_count % tNum === 0 + && this.rollTriggerChance(model, SkillTriggerType.Atking, atkConfig)) { for (let i = 0; i < triggerCount; i++) { this.dispatchSingle(atkConfig.s_uuid, model, view, SkillTriggerType.Atking, atkConfig.overrides); } @@ -149,7 +150,8 @@ export class SkillTriggerHelper { model.runtime_atked.forEach(atkConfig => { // atked_count 代表已承受的受击次数。当其余数刚好整除配置阈值时触发。 const tNum = Math.max(1, atkConfig.t_num - tNumReduce); - if (model.atked_count > 0 && model.atked_count % tNum === 0) { + if (model.atked_count > 0 && model.atked_count % tNum === 0 + && this.rollTriggerChance(model, SkillTriggerType.Atked, atkConfig)) { for (let i = 0; i < triggerCount; i++) { this.dispatchSingle(atkConfig.s_uuid, model, view, SkillTriggerType.Atked, atkConfig.overrides); } @@ -157,6 +159,31 @@ export class SkillTriggerHelper { }); } + /** + * 触发概率判定 + 保底叠加(仅 Atking/Atked 消费) + * 次数条件达成后按 t_chance(缺省 100 必触发,兼容存量配置)掷骰; + * 未命中且配置 pity_add > 0 时,为该 s_uuid 累积下次概率增量,形成"越不触发越容易触发"的保底体验; + * 触发成功后清空叠加,最终概率封顶 100。 + * + * @param model 施法者属性组件(保底缓存挂载于此) + * @param type 触发类型(决定读/写哪份保底缓存) + * @param config 当前生效的触发条目 + * @returns 是否通过概率判定 + */ + private static rollTriggerChance(model: HeroAttrsComp, type: SkillTriggerType, config: ResolvedTriggerEntry): boolean { + const pityMap = type === SkillTriggerType.Atking ? model.pity_atking : model.pity_atked; + const chance = Math.min(100, (config.t_chance ?? 100) + (pityMap[config.s_uuid] ?? 0)); + if (chance >= 100 || Math.random() * 100 < chance) { + pityMap[config.s_uuid] = 0; // 触发成功:清空保底叠加 + return true; + } + const pityAdd = config.pity_add ?? 0; + if (pityAdd > 0) { + pityMap[config.s_uuid] = (pityMap[config.s_uuid] ?? 0) + pityAdd; + } + return false; + } + /** * 通用的数组型触发器处理(适用于 FStart 等无需额外判定的简单列表触发) */ diff --git a/put/web/src/components/TriggerGroupEditor.vue b/put/web/src/components/TriggerGroupEditor.vue index 373c62a9..9586ba84 100644 --- a/put/web/src/components/TriggerGroupEditor.vue +++ b/put/web/src/components/TriggerGroupEditor.vue @@ -15,9 +15,17 @@ - + + @@ -42,18 +50,22 @@