refactor: 重构复活机制,将复活逻辑整合到dead触发组

1.  新增SkillOverrides的revive_hp和revive_count配置项,替代原独立复活字段
2.  移除所有revive相关的旧配置、解析函数和UI展示逻辑
3.  调整战斗逻辑,从dead触发组的overrides中读取复活配置
4.  更新文档说明,统一复活机制的配置方式
5.  清理冗余的导入和类型定义
This commit is contained in:
panFD
2026-09-03 22:28:38 +08:00
parent 87f771edd1
commit b0038e74c8
12 changed files with 120 additions and 131 deletions

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"
@@ -285,17 +285,9 @@ export function getFieldSkillName(hero: heroInfo | undefined, uuid: number): str
}
/**
* 查询复活技能的对外展示名(英雄语境,LvReviveEntry.name 优先,缺省回退固定称谓"凤凰涅槃")。
* Why: 名称收敛进 heroSet 英雄配置,复活底座 6501 在不同英雄下可有特色名(如"回光返照")。
* @param hero 英雄配置(含 revive 档位的 heroInfo)
* @param sUuid 复活底座技能 uuid(指向 SkillSet 6501)
* 复活已纳入 dead 触发组:通过 SkillOverrides.revive_hp / revive_count 配置,
* 不再需要独立的 revive 字段和解析函数。
*/
export function getReviveSkillName(hero: heroInfo | undefined, sUuid: number): string {
for (const e of hero?.revive ?? []) {
if (e.s_uuid === sUuid && e.name) return e.name;
}
return "凤凰涅槃";
}
/**
* 英雄/怪物基础信息接口
@@ -322,7 +314,6 @@ export interface heroInfo {
[SkillTriggerType.Field]?: LvFieldEntry[]; // 驻场光环(按 lv 升序,运行时取 ≤英雄等级 的最大档)
[SkillTriggerType.Atking]?: TriggerGrouped; // 普通攻击后触发的技能配置,s_uuid: 技能id, t_num: 触发所需的普攻次数
[SkillTriggerType.Atked]?: TriggerGrouped; // 受击后触发的技能配置,s_uuid: 技能id, t_num: 触发所需的受击次数
[SkillTriggerType.Revive]?: LvReviveEntry[]; // 复活技能配置(按 lv 升序,运行时取 ≤英雄等级 的最大档)
dis?: number; // 攻击距离(像素)
speed?: number; // 移动速度(像素/秒)
skills: Record<number, HSkillInfo>; // 携带技能ID列表
@@ -431,20 +422,6 @@ export interface LvFieldEntry {
desc?: string;
}
/**
* 复活技能按等级解锁:运行时取 ≤英雄等级 的最大 lv 档。
* name 为该复活技能在英雄语境下的对外展示名(写在第 1 档),缺省回退固定称谓"凤凰涅槃"。
*/
export interface LvReviveEntry {
lv: number;
s_uuid: number;
r_num: number;
upr: number;
name?: string; // 英雄语境对外展示名(写在第 1 档)
/** 档位描述(可选,缺省由 HeroSkillText 自动生成) */
desc?: string;
}
/**
* 额外属性加成按等级叠加:运行时累加所有 ≤英雄等级 的档位。
*/
@@ -908,16 +885,6 @@ export function resolveFieldByLv(field: LvFieldEntry[] | undefined, lv: number):
return pick ? pick.uuids : [];
}
/** 解析复活技能在目标等级下的有效配置(取 ≤lv 的最大档) */
export function resolveReviveByLv(revive: LvReviveEntry[] | undefined, lv: number): { s_uuid: number; r_num: number; upr: number } | undefined {
if (!revive || revive.length === 0) return undefined;
let pick: LvReviveEntry | undefined;
for (const e of revive) {
if (e.lv <= lv && (!pick || e.lv > pick.lv)) pick = e;
}
return pick ? { s_uuid: pick.s_uuid, r_num: pick.r_num, upr: pick.upr } : undefined;
}
/** 计算目标等级下额外属性加成(hp/ap/def_bonus 一次性奖励 + 成长类型每级递增) */
function getEvolveBonuses(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
const lv = Math.max(1, targetLv);
@@ -1020,6 +987,23 @@ function getWaveCount(seconds: number): number {
return seconds / HERO_POWER_WEIGHTS.WAVE_DURATION;
}
/**
* 从 dead 触发配置中解析最大复活次数(revive_count)。
* 遍历所有 dead 技能的 overrides,取 revive_count 最大值。
* @param dead 死亡触发配置
* @param lv 英雄等级
* @returns 最大复活次数,无复活配置时返回 0
*/
export function resolveMaxReviveCount(dead: TriggerGrouped | undefined, lv: number): number {
const triggers = resolveTriggerByLv(dead, lv);
let maxRevive = 0;
for (const t of triggers) {
const count = t.overrides?.revive_count ?? 0;
if (count > maxRevive) maxRevive = count;
}
return maxRevive;
}
/** 计算触发技在目标时间窗内的触发次数 */
function getTriggerCount(
type: SkillTriggerType,
@@ -1035,7 +1019,9 @@ function getTriggerCount(
case SkillTriggerType.FStart:
return getWaveCount(seconds);
case SkillTriggerType.Dead:
return getWaveCount(seconds) * (1 + (resolveReviveByLv(hero.revive, FightSet.HERO_MAX_LV)?.r_num || 0));
// 死亡触发次数 = 回合数 × (1 + 最大复活次数),复活从 dead 配置中提取
const maxRevive = resolveMaxReviveCount(hero.dead, FightSet.HERO_MAX_LV);
return getWaveCount(seconds) * (1 + maxRevive);
}
return 1;
}
@@ -1316,9 +1302,14 @@ export function calcHeroPowerDetailed(hero: heroInfo, targetLv: number = 1, seco
const field = fieldEntries.length > 0 ? calcFieldPowerDetailed(fieldEntries, hero, targetLv, seconds) : { total: 0, items: [] as FieldSkillEval[] };
let reviveValue = 0;
const revive = resolveReviveByLv(hero.revive, targetLv);
if (revive) {
reviveValue = hpEff * revive.upr * revive.r_num * weights.W_revive * getWaveCount(seconds);
// 复活价值从 dead 触发配置中提取(revive_hp / revive_count)
const deadTriggers = resolveTriggerByLv(hero.dead, targetLv);
for (const t of deadTriggers) {
const reviveHp = t.overrides?.revive_hp;
const reviveCount = t.overrides?.revive_count ?? 0;
if (reviveHp !== undefined && reviveCount > 0) {
reviveValue = hpEff * (reviveHp / 100) * reviveCount * weights.W_revive * getWaveCount(seconds);
}
}
const total = hpValue + dpsValue + atking.total + atked.total + fstart.total + dead.total + field.total + reviveValue;