feat(技能系统): 添加技能类型枚举并重构天赋系统

- 在SkillSet.ts中新增HSSet枚举区分普通攻击、技能和必杀技
- 重构TalSet.ts中的天赋效果枚举,移除N_ATK和N_SKILL类型
- 在HeroSkillsComp中增加hset字段标识技能类型
- 修改SACastSystem以支持根据技能类型触发不同天赋
- 完全重写TalComp组件,实现更完善的天赋触发和效果管理
This commit is contained in:
2025-11-18 23:54:25 +08:00
parent 7b067213c0
commit 9798930879
5 changed files with 262 additions and 40 deletions

View File

@@ -1,39 +1,221 @@
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { BuffConf, SkillSet } from "../common/config/SkillSet";
import { TalAttrs, TalEffet, TalTarget, TriType } from "../common/config/TalSet";
import { HeroInfo } from "../common/config/heroSet";
import { TalAttrs, talConf, TalEffet, TalTarget, TriType} from "../common/config/TalSet";
import { HeroViewComp } from "./HeroViewComp";
/**
* 天赋槽位接口定义
* 描述单个天赋的数据结构
*/
export interface TalSlot {
uuid: number; // 天赋ID
uuid: number; // 天赋唯一标识符
name: string; // 天赋名称
value: number; // 触发的效果价值
Trigger:boolean //触发值减值
C_Trigger:number //当前值
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; // 当前累积值
}
/**
* 天赋系统组件类
* 继承自 CCComp作为 ECS 架构中的组件存在
* 负责管理英雄的天赋系统,包括天赋获取、触发、效果应用等
* 作为ECS架构中的组件,负责管理英雄的天赋系统
*
* 核心功能:
* - 初始化英雄天赋系统
* - 添加新天赋到英雄
* - 累积天赋触发进度
* - 检查并触发满足条件的天赋
* - 管理天赋效果数值
*/
@ecs.register('TalComp', false)
export class TalComp extends ecs.Comp {
/** 英雄视图组件引用,运行时获取避免循环引用 */
/** 英雄视图组件引用,运行时获取避免循环引用 */
private heroView: any = null;
private skillCon:any=null;
/** 英雄唯一标识符,用于从配置中获取英雄信息 */
/** 英雄唯一标识符,用于从配置中获取英雄相关信息 */
private heroUuid: number = 0;
/** 天赋数组 */
/** 天赋集合以天赋ID为键存储所有已获得的天赋 */
Tals: Record<number, TalSlot> = {};
/** 天赋槽位数组,默认开启2个最多4个 */
TalSlots:number[]=[1,1,0,0]
reset() {
/**
* 组件初始化方法
* @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;
}
}