1. 重构英雄属性组件,将静态配置与运行时缓存分离,新增runtime_前缀的运行时解析字段 2. 移除旧的evolve进化配置处理逻辑,改为通过等级解析器动态获取当前等级生效的技能与属性 3. 统一怪物与英雄的技能触发逻辑,均使用运行时缓存字段 4. 更新测试模式配置结构,适配新的分组+等级数组配置格式 5. 优化技能描述生成逻辑,支持新的等级配置结构
65 lines
2.7 KiB
TypeScript
65 lines
2.7 KiB
TypeScript
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;
|
||
}
|
||
}
|