refactor(hero): 重构技能触发与属性系统,使用运行时解析缓存
1. 重构英雄属性组件,将静态配置与运行时缓存分离,新增runtime_前缀的运行时解析字段 2. 移除旧的evolve进化配置处理逻辑,改为通过等级解析器动态获取当前等级生效的技能与属性 3. 统一怪物与英雄的技能触发逻辑,均使用运行时缓存字段 4. 更新测试模式配置结构,适配新的分组+等级数组配置格式 5. 优化技能描述生成逻辑,支持新的等级配置结构
This commit is contained in:
@@ -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, HeroPos, resolveFormationTargetX } from "../common/config/heroSet";
|
||||
import { HeroInfo, HeroPos, resolveFormationTargetX, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv } from "../common/config/heroSet";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { SkillTriggerType } from "../common/config/heroSet";
|
||||
import { SkillTriggerHelper } from "./SkillTriggerHelper";
|
||||
@@ -126,7 +126,7 @@ export class Hero extends ecs.Entity {
|
||||
smc.mission.heroGrid[posIndex] = this.eid;
|
||||
}
|
||||
|
||||
// 复制触发技能配置
|
||||
// 复制触发技能配置(新结构:按 s_uuid 分组 + lv 数组)
|
||||
model.call = hero.call;
|
||||
model.dead = hero.dead;
|
||||
model.fstart = hero.fstart;
|
||||
@@ -135,6 +135,8 @@ export class Hero extends ecs.Entity {
|
||||
model.atked = hero.atked;
|
||||
model.field = hero.field;
|
||||
model.revive = hero.revive;
|
||||
model.ap_bonus = hero.ap_bonus;
|
||||
model.hp_bonus = hero.hp_bonus;
|
||||
|
||||
// 基础属性按等级倍率初始化
|
||||
// 使用指数增长公式:等级 2 时为原来的 HERO_LV_MULTIPLIER 倍,等级 3 时为 HERO_LV_MULTIPLIER^2 倍
|
||||
@@ -164,38 +166,26 @@ export class Hero extends ecs.Entity {
|
||||
model.skills[skill.uuid] = { ...skill, lv: Math.max(0, skill.lv + hero_lv - 2), ccd: 0 };
|
||||
}
|
||||
|
||||
// 应用等级进化配置(从 lv2 开始逐级覆盖)
|
||||
if (hero.evolve) {
|
||||
// 记录 evolve 配置快照(只读引用),供 UI 计算 ap/hp 额外加成文案
|
||||
model.evolve = hero.evolve;
|
||||
for (let elv = 2; elv <= hero_lv; elv++) {
|
||||
const evo = hero.evolve[elv];
|
||||
if (!evo) continue;
|
||||
// 替换普攻技能
|
||||
if (evo.skill) {
|
||||
const oldSkill = Object.values(model.skills)[0];
|
||||
model.skills = {};
|
||||
model.skills[evo.skill.s_uuid] = {
|
||||
uuid: evo.skill.s_uuid,
|
||||
lv: Math.max(0, 1 + hero_lv - 2),
|
||||
cd: evo.skill.cd ?? oldSkill?.cd ?? 1,
|
||||
ccd: 0,
|
||||
overrides: evo.skill.overrides,
|
||||
};
|
||||
}
|
||||
// 覆盖触发技能
|
||||
if (evo.atking) model.atking = evo.atking;
|
||||
if (evo.atked) model.atked = evo.atked;
|
||||
if (evo.dead) model.dead = evo.dead;
|
||||
if (evo.fstart) model.fstart = evo.fstart;
|
||||
if (evo.fend) model.fend = evo.fend;
|
||||
// 覆盖驻场光环(存活期间全局生效)
|
||||
if (evo.field) model.field = evo.field;
|
||||
if (evo.revive) model.revive = evo.revive;
|
||||
// 额外属性加成
|
||||
if (evo.ap_bonus) model.ap += evo.ap_bonus;
|
||||
if (evo.hp_bonus) { model.hp += evo.hp_bonus; model.hp_max += evo.hp_bonus; }
|
||||
}
|
||||
// 按当前英雄等级 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_fend = resolveTriggerByLv(model.fend, 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);
|
||||
|
||||
// 应用额外属性加成(hp_bonus/ap_bonus 按 ≤英雄等级 累加)
|
||||
if (model.hp_bonus) {
|
||||
let hpExtra = 0;
|
||||
for (const e of model.hp_bonus) { if (e.lv <= hero_lv) hpExtra += e.value; }
|
||||
model.hp += hpExtra; model.hp_max += hpExtra;
|
||||
}
|
||||
if (model.ap_bonus) {
|
||||
let apExtra = 0;
|
||||
for (const e of model.ap_bonus) { if (e.lv <= hero_lv) apExtra += e.value; }
|
||||
model.ap += apExtra;
|
||||
}
|
||||
|
||||
// 缓存技能射程等派生数据,减少战斗帧内重复计算
|
||||
|
||||
Reference in New Issue
Block a user