添加add_hp、add_mp和add_shield方法用于管理英雄基础属性 移除HeroViewComp.health方法中不再使用的is_num参数 恢复TalComp中HP和MP天赋效果的处理逻辑
251 lines
8.8 KiB
TypeScript
251 lines
8.8 KiB
TypeScript
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||
import { BType } from "../common/config/HeroAttrs";
|
||
import { TalAttrs, talConf, TalEffet, TalTarget, TriType} from "../common/config/TalSet";
|
||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||
import { HeroViewComp } from "./HeroViewComp";
|
||
|
||
/**
|
||
* 天赋槽位接口定义
|
||
* 描述单个天赋的数据结构
|
||
*/
|
||
export interface TalSlot {
|
||
uuid: number; // 天赋唯一标识符
|
||
name: string; // 天赋名称
|
||
triType: TriType; // 天赋触发类型
|
||
target: TalTarget;
|
||
effet: TalEffet;
|
||
attrs?:TalAttrs //触发的attrs效果的对应attrs value: number; // 触发的效果数值
|
||
vType:BType; // 数值型还是百分比型
|
||
value: number; // 触发的效果数值
|
||
value_add: number; // 触发的效果数值增量
|
||
count: number; // 执行次数,及可以触发的次数
|
||
count_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 uuid 要添加的天赋ID
|
||
*
|
||
* 添加流程:
|
||
* 1. 检查天赋是否已存在
|
||
* 2. 检查天赋配置是否存在
|
||
* 3. 创建并初始化天赋数据
|
||
*/
|
||
addTal(uuid: number) {
|
||
// 检查天赋是否已存在
|
||
if (this.Tals[uuid]) {
|
||
console.error(`[TalComp]天赋已存在,天赋ID:${uuid}`);
|
||
return;
|
||
}
|
||
|
||
// 获取天赋配置
|
||
const tConf = talConf[uuid];
|
||
if (!tConf) {
|
||
console.error(`[TalComp]天赋配置不存在,天赋ID:${uuid}`);
|
||
return;
|
||
}
|
||
|
||
// 创建并初始化天赋数据
|
||
this.Tals[uuid] = {
|
||
uuid: uuid,
|
||
name: tConf.name,
|
||
triType: tConf.triType,
|
||
target: tConf.target,
|
||
effet: tConf.effet,
|
||
attrs: tConf.attrs,
|
||
vType: tConf.vType,
|
||
value: tConf.value, // 效果数值初始为配置值
|
||
value_add: 0, // 效果数值增量初始为0
|
||
count: 1, // 执行次数,及可以触发的次数
|
||
count_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<string, TalSlot> = {};
|
||
// 遍历所有天赋
|
||
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 uuid 天赋ID
|
||
* @param val 要增减的数值
|
||
*
|
||
* 功能:
|
||
* - 用于调整天赋的实际效果数值
|
||
* - 可通过正负数来增加或减少效果
|
||
*/
|
||
updateVal(uuid: number, val: number) {
|
||
// 检查天赋是否存在
|
||
if (!this.Tals[uuid]) {
|
||
console.error(`[TalComp]天赋不存在,天赋ID:${uuid}`);
|
||
return;
|
||
}
|
||
|
||
// 更新天赋效果数值
|
||
this.Tals[uuid].value_add += val;
|
||
}
|
||
|
||
updateTrigger(uuid: number, val: number) {
|
||
// 检查天赋是否存在
|
||
if (!this.Tals[uuid]) {
|
||
console.error(`[TalComp]天赋不存在,天赋ID:${uuid}`);
|
||
return;
|
||
}
|
||
|
||
// 更新天赋触发阈值
|
||
this.Tals[uuid].Trigger_add += val;
|
||
if (this.Tals[uuid].Trigger-this.Tals[uuid].Trigger_add <= 1) {
|
||
this.Tals[uuid].Trigger_add = this.Tals[uuid].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;
|
||
this.checkTrigger(talent.uuid);
|
||
}
|
||
}
|
||
}
|
||
checkTrigger(uuid:number){
|
||
const talent = this.Tals[uuid];
|
||
if (talent.cur >= (talent.Trigger - talent.Trigger_add)) { // 修复触发条件,累积值达到或超过触发阈值时触发
|
||
console.log(`[TalComp]天赋触发,天赋ID:${uuid}`);
|
||
for(let i=0;i<(talent.count+talent.count_add);i++){
|
||
this.doTriggerTal(talent.uuid);
|
||
}
|
||
// 重置累积值
|
||
talent.cur = 0;
|
||
|
||
}
|
||
}
|
||
//执行天赋触发效果
|
||
// 功能:
|
||
// - 根据天赋类型执行相应的效果
|
||
// - 支持计数型和数值型天赋
|
||
// --heroAttrs.addTalent 是计数型天赋buff heroAttrs.addTalBuff 是数值型天赋buff
|
||
doTriggerTal(uuid: number) {
|
||
// 检查天赋是否存在
|
||
if (!this.Tals[uuid]) {
|
||
console.error(`[TalComp]天赋不存在,天赋ID:${uuid}`);
|
||
return;
|
||
}
|
||
const talent = this.Tals[uuid];
|
||
const heroAttrs=this.ent.get(HeroAttrsComp);
|
||
switch(talent.effet){
|
||
case TalEffet.ATK_DMG:
|
||
heroAttrs.addCountTal(TalEffet.ATK_DMG, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.SKILL_DMG:
|
||
heroAttrs.addCountTal(TalEffet.SKILL_DMG, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.LDMG:
|
||
heroAttrs.addCountTal(TalEffet.LDMG, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.HP:
|
||
heroAttrs.add_hp(talent.value + talent.value_add,talent.vType == BType.VALUE);
|
||
break;
|
||
case TalEffet.MP:
|
||
heroAttrs.add_mp(talent.value + talent.value_add,talent.vType == BType.VALUE);
|
||
break;
|
||
case TalEffet.WFUNY:
|
||
heroAttrs.addCountTal(TalEffet.WFUNY, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.D_SKILL:
|
||
heroAttrs.addCountTal(TalEffet.D_SKILL, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.C_ATK:
|
||
heroAttrs.addCountTal(TalEffet.C_ATK, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.C_SKILL:
|
||
heroAttrs.addCountTal(TalEffet.C_SKILL, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.C_MSKILL:
|
||
heroAttrs.addCountTal(TalEffet.C_MSKILL, talent.value + talent.value_add);
|
||
break;
|
||
case TalEffet.BUFF:
|
||
heroAttrs.addValueTal(talent.uuid, talent.attrs, talent.vType, talent.value + talent.value_add);
|
||
break;
|
||
}
|
||
}
|
||
/**
|
||
* 重置组件状态
|
||
*/
|
||
reset() {
|
||
this.Tals = {};
|
||
this.heroUuid = 0;
|
||
this.heroView = null;
|
||
}
|
||
|
||
|
||
|
||
} |