Files
pixelheros/assets/script/game/hero/FieldSkillHelper.ts
pan 57c7934571 refactor(hero): 重构技能触发与属性系统,使用运行时解析缓存
1. 重构英雄属性组件,将静态配置与运行时缓存分离,新增runtime_前缀的运行时解析字段
2. 移除旧的evolve进化配置处理逻辑,改为通过等级解析器动态获取当前等级生效的技能与属性
3. 统一怪物与英雄的技能触发逻辑,均使用运行时缓存字段
4. 更新测试模式配置结构,适配新的分组+等级数组配置格式
5. 优化技能描述生成逻辑,支持新的等级配置结构
2026-08-04 16:46:59 +08:00

65 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { FacSet } from "../common/config/GameSet";
import { FieldSkillSet, FieldSkillType } from "../common/config/SkillSet";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { SkillBoxComp } from "../map/SkillBoxComp";
import { EquipBoxComp } from "../map/EquipBoxComp";
/**
* 驻场技能(光环属性)计算辅助类
*
* 核心职责:
* 统一管理全场存活英雄带来的全局加成属性计算。
* 解耦原先写在 HeroAttrsComp 中的静态计算逻辑,符合单一职责原则。
*/
export class FieldSkillHelper {
/** 获取指定驻场技能类型的总加成值(计算存活的友方英雄 + 场上的驻场技能卡) */
public static getFieldSkillTotalValue(type: FieldSkillType): number {
let total = 0;
// 1. 统计英雄带来的驻场技能加成
// 读 model.runtime_field已按当前等级 resolve 的 uuid 列表)
ecs.query(ecs.allOf(HeroAttrsComp)).forEach((entity: ecs.Entity) => {
const model = entity.get(HeroAttrsComp);
if (!model || model.is_dead || model.fac !== FacSet.HERO) return;
const fields = model.runtime_field;
if (fields) {
for (const skillUuid of fields) {
const skillConfig = FieldSkillSet[skillUuid];
if (skillConfig && skillConfig.type === type) {
total += skillConfig.value;
}
}
}
});
// 2. 统计技能盒子(技能卡)带来的驻场技能加成
ecs.query(ecs.allOf(SkillBoxComp)).forEach((entity: ecs.Entity) => {
const skillBox = entity.get(SkillBoxComp);
if (!skillBox || !skillBox.field || skillBox.field.length === 0) return;
for (const skillUuid of skillBox.field) {
const skillConfig = FieldSkillSet[skillUuid];
if (skillConfig && skillConfig.type === type) {
total += skillConfig.value;
}
}
});
// 3. 统计装备盒(装备卡)带来的驻场技能加成
ecs.query(ecs.allOf(EquipBoxComp)).forEach((entity: ecs.Entity) => {
const equipBox = entity.get(EquipBoxComp);
if (!equipBox || !equipBox.field || equipBox.field.length === 0) return;
for (const skillUuid of equipBox.field) {
const skillConfig = FieldSkillSet[skillUuid];
if (skillConfig && skillConfig.type === type) {
total += skillConfig.value;
}
}
});
return total;
}
}