diff --git a/assets/script/game/common/config/TalSet.ts b/assets/script/game/common/config/TalSet.ts index 29996507..59e54dad 100644 --- a/assets/script/game/common/config/TalSet.ts +++ b/assets/script/game/common/config/TalSet.ts @@ -1,5 +1,5 @@ import { count } from "console"; -import { Attrs } from "./HeroAttrs"; +import { Attrs, BType } from "./HeroAttrs"; /** * 天赋类型枚举,也是触发条件 @@ -56,6 +56,7 @@ export interface ItalConf { triType: TriType; target: TalTarget; effet: TalEffet; + vType:BType; //数值型还是百分比型 value: number; // 触发的效果值(如增加10%攻击力, 触发的技能uuid,增加1个技能uuid) attrs?:TalAttrs //触发的attrs效果的对应attrs Trigger:number //触发值 @@ -80,42 +81,42 @@ export interface ItalConf { */ export const talConf: Record = { /*** 普通攻击触发 ***/ - 7001:{uuid:7001,name:"风怒",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.WFUNY,value:50,attrs:TalAttrs.NON, + 7001:{uuid:7001,name:"风怒",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.WFUNY,vType:BType.RATIO, value:50,attrs:TalAttrs.NON, desc:"普通攻击3次后, 立即给与目标150%伤害的额外打击"}, - 7002:{uuid:7002,name:"溅射",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.SPLASH,value:50,attrs:TalAttrs.NON, + 7002:{uuid:7002,name:"溅射",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.SPLASH,vType:BType.RATIO, value:50,attrs:TalAttrs.NON, desc:"普通攻击3次后, 会对目标100码内的敌人造成30%伤害"}, - 7003:{uuid:7003,name:"回血",triType:TriType.ATK,Trigger:3,target:TalTarget.SELF,effet:TalEffet.HP,value:1,attrs:TalAttrs.NON, + 7003:{uuid:7003,name:"回血",triType:TriType.ATK,Trigger:3,target:TalTarget.SELF,effet:TalEffet.HP,vType:BType.RATIO, value:1,attrs:TalAttrs.NON, desc:"普通攻击3次后, 会回复10%的生命值"}, - 7004:{uuid:7004,name:"回蓝",triType:TriType.ATK,Trigger:3,target:TalTarget.SELF,effet:TalEffet.MP,value:1,attrs:TalAttrs.NON, + 7004:{uuid:7004,name:"回蓝",triType:TriType.ATK,Trigger:3,target:TalTarget.SELF,effet:TalEffet.MP,vType:BType.RATIO, value:1,attrs:TalAttrs.NON, desc:"普通攻击3次后, 会回复10%的蓝值"}, - 7005:{uuid:7005,name:"冰冻",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,value:5,attrs:TalAttrs.FREEZE_CHANCE, + 7005:{uuid:7005,name:"冰冻",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,vType:BType.RATIO, value:5,attrs:TalAttrs.FREEZE_CHANCE, desc:"普通攻击3次后, 获得5%的冻结率"}, - 7006:{uuid:7006,name:"沉默",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,value:5,attrs:TalAttrs.SILENCE_CHANCE, + 7006:{uuid:7006,name:"沉默",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,vType:BType.RATIO, value:5,attrs:TalAttrs.SILENCE_CHANCE, desc:"普通攻击3次后, 获得5%的沉默率"}, - 7007:{uuid:7007,name:"击退",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,value:5,attrs:TalAttrs.BACK_CHANCE, + 7007:{uuid:7007,name:"击退",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,vType:BType.RATIO, value:5,attrs:TalAttrs.BACK_CHANCE, desc:"普通攻击3次后, 获得5%的击退率"}, - 7008:{uuid:7008,name:"会心",triType:TriType.ATK,Trigger:3,target:TalTarget.SELF,effet:TalEffet.BUFF,value:5,attrs:TalAttrs.CRITICAL, + 7008:{uuid:7008,name:"会心",triType:TriType.ATK,Trigger:3,target:TalTarget.SELF,effet:TalEffet.BUFF,vType:BType.RATIO, value:5,attrs:TalAttrs.CRITICAL, desc:"普通攻击3次后, 获得5%的暴击率"}, - 7009:{uuid:7009,name:"眩晕",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,value:5,attrs:TalAttrs.STUN_CHANCE, + 7009:{uuid:7009,name:"眩晕",triType:TriType.ATK,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.BUFF,vType:BType.RATIO, value:5,attrs:TalAttrs.STUN_CHANCE, desc:"普通攻击3次后, 获得5%的眩晕率"}, - 7010:{uuid:7010,name:"熟练",triType:TriType.ATK,Trigger:10,target:TalTarget.SELF,effet:TalEffet.D_SKILL,value:0,attrs:TalAttrs.NON, + 7010:{uuid:7010,name:"熟练",triType:TriType.ATK,Trigger:10,target:TalTarget.SELF,effet:TalEffet.D_SKILL,vType:BType.RATIO, value:0,attrs:TalAttrs.NON, desc:"普通攻击10次后, 下次一般技能额外释放1次,伤害100%"}, /*** 受伤触发 ***/ - 7101:{uuid:7101,name:"反击",triType:TriType.DMG,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.DMG,value:50,attrs:TalAttrs.NON, + 7101:{uuid:7101,name:"反击",triType:TriType.DMG,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.DMG,vType:BType.RATIO, value:50,attrs:TalAttrs.NON, desc:"被攻击3次后, 给于目标50%的伤害"}, - 7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,target:TalTarget.SELF,effet:TalEffet.SHIELD,value:20,attrs:TalAttrs.NON, + 7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,target:TalTarget.SELF,effet:TalEffet.SHIELD,vType:BType.RATIO, value:20,attrs:TalAttrs.NON, desc:"被攻击3次后, 获得20%的生命值护盾"}, - 7103:{uuid:7103,name:"减伤",triType:TriType.DMG,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.LDMG,value:50,attrs:TalAttrs.NON, + 7103:{uuid:7103,name:"减伤",triType:TriType.DMG,Trigger:3,target:TalTarget.ENEMY,effet:TalEffet.LDMG,vType:BType.RATIO, value:50,attrs:TalAttrs.NON, desc:"被攻击3次后, 下1次伤害减50%"}, /*** 失去血量触发 ***/ //需要重新设计,触发类型 - 7201:{uuid:7201,name:"背水",triType:TriType.HPL,Trigger:50,target:TalTarget.SELF,effet:TalEffet.BUFF,value:10,attrs:TalAttrs.AP, + 7201:{uuid:7201,name:"背水",triType:TriType.HPL,Trigger:50,target:TalTarget.SELF,effet:TalEffet.BUFF,vType:BType.VALUE, value:10,attrs:TalAttrs.AP, desc:"每失去50%生命值,获得下10次普通攻击暴击"}, /*** 升级触发 ***/ //需要重新设计,触发类型 - 7301:{uuid:7301,name:"勤勉",triType:TriType.LUP,Trigger:1,target:TalTarget.SELF,effet:TalEffet.BUFF,value:5,attrs:TalAttrs.AP, + 7301:{uuid:7301,name:"勤勉",triType:TriType.LUP,Trigger:1,target:TalTarget.SELF,effet:TalEffet.BUFF,vType:BType.VALUE, value:5,attrs:TalAttrs.AP, desc:"每升1级,获得下5次技能暴击"}, }; diff --git a/assets/script/game/hero/HeroAttrsComp.ts b/assets/script/game/hero/HeroAttrsComp.ts index 67270272..ed00eb42 100644 --- a/assets/script/game/hero/HeroAttrsComp.ts +++ b/assets/script/game/hero/HeroAttrsComp.ts @@ -38,8 +38,7 @@ export class HeroAttrsComp extends ecs.Comp { //=====================天赋触发标签===================== tal_DSill:talTrigger={value:0,count:0} tal_WFuny:talTrigger={value:0,count:0} - /** 天赋buff数组 - 触发过期,数量可叠加 */ - BUFFS_TAL: Record> = {}; + BUFFS_TAL: Record = {}; // ==================== 技能距离缓存 ==================== maxSkillDistance: number = 0; // 最远技能攻击距离(缓存,受MP影响) @@ -188,12 +187,10 @@ export class HeroAttrsComp extends ecs.Comp { } } } - // 遍历天赋buff数组(数值型叠加 value*count) - if (this.BUFFS_TAL[attrIndex] && this.BUFFS_TAL[attrIndex].length > 0) { - for (const buff of this.BUFFS_TAL[attrIndex]) { - if (buff.BType === BType.VALUE) { - totalValue += buff.value * buff.count; - } + for (const key in this.BUFFS_TAL) { + const buff = this.BUFFS_TAL[Number(key)]; + if (buff.attrIndex === attrIndex && buff.BType === BType.VALUE) { + totalValue += buff.value; } } @@ -216,12 +213,10 @@ export class HeroAttrsComp extends ecs.Comp { } } } - // 遍历天赋buff数组(百分比型叠加 value*count) - if (this.BUFFS_TAL[attrIndex] && this.BUFFS_TAL[attrIndex].length > 0) { - for (const buff of this.BUFFS_TAL[attrIndex]) { - if (buff.BType === BType.RATIO) { - totalRatio += buff.value * buff.count; - } + for (const key in this.BUFFS_TAL) { + const buff = this.BUFFS_TAL[Number(key)]; + if (buff.attrIndex === attrIndex && buff.BType === BType.RATIO) { + totalRatio += buff.value; } } @@ -413,6 +408,25 @@ export class HeroAttrsComp extends ecs.Comp { } + addTalBuff(t_uuid: number, attrIndex?: number, bType?: BType, value: number = 0) { + if (attrIndex === undefined || bType === undefined) return; + const buff = this.BUFFS_TAL[t_uuid]; + if (!buff) { + this.BUFFS_TAL[t_uuid] = { count: 1, BType: bType, attrIndex, value }; + } else { + buff.count += 1; + buff.value += value; + } + this.recalculateSingleAttr(attrIndex); + } + clearTalBuff(t_uuid: number) { + const buff = this.BUFFS_TAL[t_uuid]; + if (!buff) return; + const attrIndex = buff.attrIndex; + delete this.BUFFS_TAL[t_uuid]; + this.recalculateSingleAttr(attrIndex); + } + reset() { // 重置为初始状态 @@ -451,45 +465,8 @@ export class HeroAttrsComp extends ecs.Comp { this.atk_count = 0; this.atked_count = 0; } - private getTalAttr(tal: number) { - const conf = talConf[tal]; - if (!conf) return null; - const attrIndex = conf.attrs ?? TalAttrs.NON; - if (attrIndex === TalAttrs.NON) return null; - const bType = AttrsType[attrIndex as unknown as number]; - const value = conf.value; - return { attrIndex: attrIndex as unknown as number, bType, value }; - } - addTalBuff(tal: number, count: number = 1) { - const info = this.getTalAttr(tal); - if (!info) return; - const { attrIndex, bType, value } = info; - if (!this.BUFFS_TAL[attrIndex]) this.BUFFS_TAL[attrIndex] = []; - const list = this.BUFFS_TAL[attrIndex]; - const exist = list.find(i => i.tal === tal && i.BType === bType); - if (exist) { - exist.count += count; - } else { - list.push({ tal, value, BType: bType, count }); - } - this.recalculateSingleAttr(attrIndex); - } - clearTalBuff(tal: number) { - const affected = new Set(); - for (const key in this.BUFFS_TAL) { - const idx = parseInt(key); - const list = this.BUFFS_TAL[idx]; - if (!list || list.length === 0) continue; - const newList = list.filter(i => i.tal !== tal); - if (newList.length !== list.length) { - this.BUFFS_TAL[idx] = newList; - affected.add(idx); - if (newList.length === 0) delete this.BUFFS_TAL[idx]; - } - } - affected.forEach(i => this.recalculateSingleAttr(i)); - } + } diff --git a/assets/script/game/hero/TalComp.ts b/assets/script/game/hero/TalComp.ts index 6473b093..a3b02148 100644 --- a/assets/script/game/hero/TalComp.ts +++ b/assets/script/game/hero/TalComp.ts @@ -1,4 +1,5 @@ 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"; @@ -14,6 +15,7 @@ export interface TalSlot { target: TalTarget; effet: TalEffet; attrs?:TalAttrs //触发的attrs效果的对应attrs value: number; // 触发的效果数值 + vType:BType; // 数值型还是百分比型 value: number; // 触发的效果数值 value_add: number; // 触发的效果数值增量 Trigger: number; // 天赋触发阈值 @@ -86,6 +88,7 @@ export class TalComp extends ecs.Comp { target: tConf.target, effet: tConf.effet, attrs: tConf.attrs, + vType: tConf.vType, value: tConf.value, // 效果数值初始为配置值 value_add: 0, // 效果数值增量初始为0 Trigger: tConf.Trigger, // 触发阈值(后续可从配置中读取) @@ -179,6 +182,7 @@ export class TalComp extends ecs.Comp { } } + //执行天赋触发效果 doTriggerTal(uuid: number) { // 检查天赋是否存在 if (!this.Tals[uuid]) { @@ -196,16 +200,13 @@ export class TalComp extends ecs.Comp { heroAttrs.tal_DSill.count += 1; heroAttrs.tal_DSill.value = talent.value+talent.value_add; break; + case TalEffet.BUFF: + heroAttrs.addTalBuff(talent.uuid, talent.attrs, talent.vType, talent.value + talent.value_add); + break; } } /** * 重置组件状态 - * - * 功能: - * - 清空所有天赋数据 - * - 重置英雄ID - * - 清除英雄视图引用 - * - 为组件的复用做准备 */ reset() { this.Tals = {};