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 { return FieldSkillHelper.getFieldSkillTotalValueForFac(type, FacSet.HERO); } /** * 获取指定阵营的驻场技能总加成值 * @param type 驻场技能类型 * @param fac 阵营(FacSet.HERO / FacSet.MON),默认 HERO * @returns 总加成值 */ public static getFieldSkillTotalValueForFac(type: FieldSkillType, fac: number = FacSet.HERO): 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 !== fac) 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. 统计技能盒子(技能卡)带来的驻场技能加成(仅英雄阵营) if (fac === FacSet.HERO) { 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; } }