refactor: 重构复活机制,将复活逻辑整合到dead触发组
1. 新增SkillOverrides的revive_hp和revive_count配置项,替代原独立复活字段 2. 移除所有revive相关的旧配置、解析函数和UI展示逻辑 3. 调整战斗逻辑,从dead触发组的overrides中读取复活配置 4. 更新文档说明,统一复活机制的配置方式 5. 清理冗余的导入和类型定义
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user