import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { TalAttrs, talConf, TalEffet, TalTarget, TriType} from "../common/config/TalSet"; import { HeroViewComp } from "./HeroViewComp"; /** * 天赋槽位接口定义 * 描述单个天赋的数据结构 */ export interface TalSlot { uuid: number; // 天赋唯一标识符 name: string; // 天赋名称 triType: TriType; // 天赋触发类型 target: TalTarget; effet: TalEffet; attrs?:TalAttrs //触发的attrs效果的对应attrs value: number; // 触发的效果数值 value: number; // 触发的效果数值 value_add: number; // 触发的效果数值增量 Trigger: number; // 天赋触发阈值 Trigger_add: number; // 天赋触发阈值减值 desc: string; // 天赋描述(说明触发条件和效果) cur: number; // 当前累积值 } /** * 天赋系统组件类 * 作为ECS架构中的组件,负责管理英雄的天赋系统 * * 核心功能: * - 初始化英雄天赋系统 * - 添加新天赋到英雄 * - 累积天赋触发进度 * - 检查并触发满足条件的天赋 * - 管理天赋效果数值 */ @ecs.register('TalComp', false) export class TalComp extends ecs.Comp { /** 英雄视图组件引用,运行时获取以避免循环引用 */ private heroView: any = null; /** 英雄唯一标识符,用于从配置中获取英雄相关信息 */ private heroUuid: number = 0; /** 天赋集合,以天赋ID为键,存储所有已获得的天赋 */ Tals: Record = {}; /** * 组件初始化方法 * @param heroUuid 英雄唯一标识符 */ init(heroUuid: number) { this.heroUuid = heroUuid; // 从实体中获取英雄视图组件引用 this.heroView = this.ent.get(HeroViewComp); // 初始化天赋集合 this.Tals = {}; } /** * 为英雄添加一个新天赋 * @param talUuid 要添加的天赋ID * * 添加流程: * 1. 检查天赋是否已存在 * 2. 检查天赋配置是否存在 * 3. 创建并初始化天赋数据 */ addTal(talUuid: number) { // 检查天赋是否已存在 if (this.Tals[talUuid]) { console.error(`[TalComp]天赋已存在,天赋ID:${talUuid}`); return; } // 获取天赋配置 const tConf = talConf[talUuid]; if (!tConf) { console.error(`[TalComp]天赋配置不存在,天赋ID:${talUuid}`); return; } // 创建并初始化天赋数据 this.Tals[talUuid] = { uuid: talUuid, name: tConf.name, triType: tConf.triType, target: tConf.target, effet: tConf.effet, attrs: tConf.attrs, value: tConf.value, // 效果数值初始为配置值 value_add: 0, // 效果数值增量初始为0 Trigger: tConf.Trigger, // 触发阈值(后续可从配置中读取) Trigger_add: 0, // 触发阈值增量初始为0 desc: tConf.desc, cur: 0, // 当前累积值初始为0 }; } checkTal() { return Object.keys(this.Tals).length > 0; } getTriggers() { // 存储所有触发的天赋 let Triggers: Record = {}; // 遍历所有天赋 for (let uuid in this.Tals) { const talent = this.Tals[uuid]; if (talent.cur >= (talent.Trigger - talent.Trigger_add)) { // 修复触发条件,累积值达到或超过触发阈值时触发 console.log(`[TalComp]天赋触发,天赋ID:${uuid}`); // 重置累积值 talent.cur = 0; // 添加到触发列表 Triggers[uuid] = talent; } } // 判断是否有天赋被触发 return Triggers; } /** * 更新天赋的效果数值 * @param talUuid 天赋ID * @param val 要增减的数值 * * 功能: * - 用于调整天赋的实际效果数值 * - 可通过正负数来增加或减少效果 */ updateVal(talUuid: number, val: number) { // 检查天赋是否存在 if (!this.Tals[talUuid]) { console.error(`[TalComp]天赋不存在,天赋ID:${talUuid}`); return; } // 更新天赋效果数值 this.Tals[talUuid].value_add += val; } updateTrigger(talUuid: number, val: number) { // 检查天赋是否存在 if (!this.Tals[talUuid]) { console.error(`[TalComp]天赋不存在,天赋ID:${talUuid}`); return; } // 更新天赋触发阈值 this.Tals[talUuid].Trigger_add += val; if (this.Tals[talUuid].Trigger-this.Tals[talUuid].Trigger_add <= 1) { this.Tals[talUuid].Trigger_add = this.Tals[talUuid].Trigger-1; } } /** * 更新指定类型天赋的累积值 * @param triType 天赋触发类型 * @param val 要增加的累积值,默认值为1 * * 设计注意: * - 当前实现只会更新第一个匹配类型的天赋 * - 累积值用于后续判断是否触发天赋效果 */ updateCur(triType: TriType, val: number = 1) { // 遍历所有天赋 for (let uuid in this.Tals) { const talent = this.Tals[uuid]; // 找到第一个匹配类型的天赋并更新 if (talent.triType == triType) { talent.cur += val; break; // 只更新第一个匹配的天赋 } } } /** * 重置组件状态 * * 功能: * - 清空所有天赋数据 * - 重置英雄ID * - 清除英雄视图引用 * - 为组件的复用做准备 */ reset() { this.Tals = {}; this.heroUuid = 0; this.heroView = null; } }