Files
heros/assets/script/game/hero/TalComp.ts
walkpan 9798930879 feat(技能系统): 添加技能类型枚举并重构天赋系统
- 在SkillSet.ts中新增HSSet枚举区分普通攻击、技能和必杀技
- 重构TalSet.ts中的天赋效果枚举,移除N_ATK和N_SKILL类型
- 在HeroSkillsComp中增加hset字段标识技能类型
- 修改SACastSystem以支持根据技能类型触发不同天赋
- 完全重写TalComp组件,实现更完善的天赋触发和效果管理
2025-11-18 23:54:25 +08:00

221 lines
7.4 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 { 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<number, TalSlot> = {};
/**
* 组件初始化方法
* @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;
}
/**
* 检查并触发指定类型的天赋
* @param triType 要检查的天赋触发类型
* @returns 触发的天赋对象集合若没有触发则返回false
*
* 检查逻辑:
* 1. 遍历所有同类型天赋
* 2. 检查累积值是否达到触发条件
* 3. 触发后重置累积值
* 4. 收集并返回所有触发的天赋
*/
checkTriggers(effet: TalEffet) {
// 存储所有触发的天赋
let Triggers: Record<string, TalSlot> = {};
// 遍历所有天赋
for (let uuid in this.Tals) {
const talent = this.Tals[uuid];
// 匹配天赋类型
if (talent.effet == effet) {
// 修复触发条件逻辑:累积值达到或超过触发阈值时触发
// 原逻辑中 `talent.Trigger-talent.Trigger` 总是为0导致任何累积值都能触发
if (talent.cur >= (talent.Trigger - talent.Trigger_add)) { // 修复触发条件,累积值达到或超过触发阈值时触发
console.log(`[TalComp]天赋触发,天赋ID:${uuid}`);
// 重置累积值
talent.cur = 0;
// 添加到触发列表
Triggers[uuid] = talent;
}
}
}
// 判断是否有天赋被触发
return Triggers;
}
checkIsTrigger(effet: TalEffet) {
for (let uuid in this.Tals) {
const talent = this.Tals[uuid];
// 匹配天赋类型
if (talent.effet == effet) {
// 修复触发条件逻辑:累积值达到或超过触发阈值时触发
// 原逻辑中 `talent.Trigger-talent.Trigger` 总是为0导致任何累积值都能触发
if (talent.cur >= (talent.Trigger - talent.Trigger_add)) { // 修复触发条件,累积值达到或超过触发阈值时触发
console.log(`[TalComp]天赋触发,天赋ID:${uuid}`);
// 重置累积值
talent.cur = 0;
// 添加到触发列表
return true;
}
}
}
}
/**
* 更新天赋的效果数值
* @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;
}
}