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

@@ -5,7 +5,7 @@ import { smc } from "../common/SingletonModuleComp";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp";
import { BoxSet, FacSet, FightSet, IndexSet } from "../common/config/GameSet";
import { HeroInfo, resolveFormationTargetX, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, resolveSkillOverrides, calcGrowBonus, HeroDisVal, getHeroQualityCoef, getEffectiveStats, HERO_LV12_SPECIAL_LV, HERO_LV12_BASE_LV, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
import { HeroInfo, resolveFormationTargetX, resolveTriggerByLv, resolveFieldByLv, resolveSkillOverrides, calcGrowBonus, HeroDisVal, getHeroQualityCoef, getEffectiveStats, HERO_LV12_SPECIAL_LV, HERO_LV12_BASE_LV, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
import { GameEvent } from "../common/config/GameEvent";
import { SkillTriggerType, HType } from "../common/config/heroSet";
import { SkillTriggerHelper } from "./SkillTriggerHelper";
@@ -137,7 +137,6 @@ export class Hero extends ecs.Entity {
model.atking = hero.atking;
model.atked = hero.atked;
model.field = hero.field;
model.revive = hero.revive;
model.ap_bonus = hero.ap_bonus;
model.hp_bonus = hero.hp_bonus;
model.def_bonus = hero.def_bonus;
@@ -173,14 +172,14 @@ export class Hero extends ecs.Entity {
model.skills[skill.uuid] = { ...skill, lv: Math.min(FightSet.HERO_SKILL_MAX_LV, Math.max(0, skill.lv + hero_lv - 2)), ccd: 0, overrides: resolveSkillOverrides(skill, hero_lv) };
}
// 按当前英雄等级 resolve 触发技能/光环/复活到运行时缓存,供 SkillTriggerHelper 消费
// 按当前英雄等级 resolve 触发技能/光环到运行时缓存,供 SkillTriggerHelper 消费
model.runtime_call = resolveTriggerByLv(model.call, hero_lv);
model.runtime_dead = resolveTriggerByLv(model.dead, hero_lv);
model.runtime_fstart = resolveTriggerByLv(model.fstart, hero_lv);
model.runtime_atking = resolveTriggerByLv(model.atking, hero_lv);
model.runtime_atked = resolveTriggerByLv(model.atked, hero_lv);
model.runtime_field = resolveFieldByLv(model.field, hero_lv);
model.runtime_revive = resolveReviveByLv(model.revive, hero_lv);
// 复活已纳入 dead 触发组,无需单独解析 revive
// 应用额外属性加成(成长类型每级递增 + hp/ap/def_bonus 一次性奖励累加)
// 成长增量:仅英雄生效(model.fac 已为 HERO),按 grow_type 递增曲线累计

View File

@@ -275,21 +275,26 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
// 先触发死亡技能(如亡语),不管后续是否续命都应触发
this.triggerDeadSkills(target);
// 濒死回血(revive 系):不是真正复活,而是血量归零瞬间消耗 1 次续命次数,
// 按比例回血继续战斗。次数每回合重置(见 MissionComp.healAllHeroes)。
// 死亡计数 +1(用于 dead 触发统计)
TAttrsComp.death_count++;
// 从 runtime_dead 中提取复活配置(revive_hp / revive_count)
let canRevive = false;
let maxReviveCount = 0;
let reviveHpPercent = 50; // 默认恢复50%
let reviveSkillConf: any = null; // 提取出来的复活技能配置
if (TAttrsComp.runtime_revive) {
const reviveConf = TAttrsComp.runtime_revive;
maxReviveCount = reviveConf.r_num + Math.floor((TAttrsComp.lv - 1) * reviveConf.upr);
if (TAttrsComp.revived_count < maxReviveCount) {
canRevive = true;
// 从配置表中读取对应的复活技能配置,ap 字段代表恢复生命值的百分比
reviveSkillConf = SkillSet[reviveConf.s_uuid];
if (reviveSkillConf && reviveSkillConf.ap) {
reviveHpPercent = reviveSkillConf.ap;
let reviveHpPercent = 0;
let reviveSkillConf: any = null;
if (TAttrsComp.runtime_dead) {
for (const trig of TAttrsComp.runtime_dead) {
const reviveHp = trig.overrides?.revive_hp;
const reviveCount = trig.overrides?.revive_count ?? 0;
if (reviveHp !== undefined && reviveCount > 0) {
maxReviveCount = reviveCount;
if (TAttrsComp.revived_count < maxReviveCount) {
canRevive = true;
reviveHpPercent = reviveHp;
reviveSkillConf = SkillSet[trig.s_uuid];
}
break; // 只取第一个复活配置
}
}
}
@@ -297,7 +302,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
if (canRevive) {
TAttrsComp.revived_count++;
TAttrsComp.is_reviving = true; // 标记为正在复活
// 根据技能配置恢复生命值
// 根据 dead 触发配置恢复生命值
TAttrsComp.hp = Math.floor(TAttrsComp.hp_max * (reviveHpPercent / 100));
TAttrsComp.dirty_hp = true;

View File

@@ -1,5 +1,5 @@
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType, TriggerGrouped, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry, HRole } from "../common/config/heroSet";
import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType, TriggerGrouped, LvFieldEntry, LvBonusEntry, FieldEntry, HRole } from "../common/config/heroSet";
import { mLogger } from "../common/Logger";
import { FacSet, FightSet } from "../common/config/GameSet";
import { FieldSkillSet, FieldSkillType, SkillOverrides } from "../common/config/SkillSet";
@@ -53,7 +53,6 @@ export class HeroAttrsComp extends ecs.Comp {
[SkillTriggerType.Atked]?: TriggerGrouped;
/** 驻场光环(按 lv 解锁,存活期间全局生效) */
[SkillTriggerType.Field]?: LvFieldEntry[];
[SkillTriggerType.Revive]?: LvReviveEntry[];
/** 额外攻击/生命/防御加成(按 lv 累加) */
ap_bonus?: LvBonusEntry[];
hp_bonus?: LvBonusEntry[];
@@ -72,8 +71,6 @@ export class HeroAttrsComp extends ecs.Comp {
runtime_fstart?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[];
/** 当前等级下生效的驻场光环词条列表 */
runtime_field?: FieldEntry[];
/** 当前等级下生效的复活配置 */
runtime_revive?: { s_uuid: number; r_num: number; upr: number };
// ==================== 特殊属性 ====================
critical: number = 0; // 暴击率
@@ -95,7 +92,8 @@ export class HeroAttrsComp extends ecs.Comp {
heal_power: number = 0; // 治疗强化(百分点;放大该英雄施放技能的治疗量,辅助专精天赋写入)
buff_power: number = 0; // buff 强化(百分点;放大该英雄施加的友方 buff 数值,辅助专精天赋写入)
revived_count: number = 0; // 已复活次数
revived_count: number = 0; // 已复活次数(从 dead 触发配置的 revive_count 限制)
death_count: number = 0; // 本回合死亡次数(用于 dead 触发统计)
invincible_time: number = 0;// 无敌时间
@@ -631,7 +629,6 @@ export class HeroAttrsComp extends ecs.Comp {
this.atking = undefined;
this.atked = undefined;
this.field = undefined;
this.revive = undefined;
this.ap_bonus = undefined;
this.hp_bonus = undefined;
this.def_bonus = undefined;
@@ -641,7 +638,6 @@ export class HeroAttrsComp extends ecs.Comp {
this.runtime_dead = undefined;
this.runtime_fstart = undefined;
this.runtime_field = undefined;
this.runtime_revive = undefined;
this.critical = 0;
this.critical_res = 0;
this.freeze_chance = 0;
@@ -654,6 +650,7 @@ export class HeroAttrsComp extends ecs.Comp {
this.knockback_res = 0;
this.critical_damage = 0;
this.revived_count = 0;
this.death_count = 0;
this.invincible_time = 0;
this.puncture_chance = 0;
this.puncture_dmg_bonus = 0;

View File

@@ -3,7 +3,7 @@ import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/O
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { smc } from "../common/SingletonModuleComp";
import { BoxSet, FacSet, FightSet, IndexSet } from "../common/config/GameSet";
import { HeroInfo, resolveTriggerByLv, resolveReviveByLv, resolveSkillOverrides, HeroDisVal, getHeroQualityCoef, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
import { HeroInfo, resolveTriggerByLv, resolveSkillOverrides, HeroDisVal, getHeroQualityCoef, HERO_LV12_SPECIAL_ATTR } from "../common/config/heroSet";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp";
import { MoveComp } from "./MoveComp";
@@ -199,7 +199,6 @@ export class Monster extends ecs.Entity {
model.fstart = hero.fstart;
model.atking = hero.atking;
model.atked = hero.atked;
model.revive = hero.revive;
// 标记是否 Boss,非 Boss 默认记作杂兵
model.is_boss = is_boss
@@ -236,16 +235,15 @@ export class Monster extends ecs.Entity {
if (testSkills.dead !== undefined) model.dead = testSkills.dead;
if (testSkills.fstart !== undefined) model.fstart = testSkills.fstart;
if (testSkills.call !== undefined) model.call = testSkills.call;
if (testSkills.revive !== undefined) model.revive = testSkills.revive;
}
// 按怪物等级 resolve 触发技能/复活到运行时缓存(怪物无 lv 成长,恒用 mon_lv)
// 按怪物等级 resolve 触发技能到运行时缓存(怪物无 lv 成长,恒用 mon_lv)
model.runtime_call = resolveTriggerByLv(model.call, mon_lv);
model.runtime_dead = resolveTriggerByLv(model.dead, mon_lv);
model.runtime_fstart = resolveTriggerByLv(model.fstart, mon_lv);
model.runtime_atking = resolveTriggerByLv(model.atking, mon_lv);
model.runtime_atked = resolveTriggerByLv(model.atked, mon_lv);
model.runtime_revive = resolveReviveByLv(model.revive, mon_lv);
// 复活已纳入 dead 触发组,无需单独解析 revive
// 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache();