feat(天赋系统): 重构天赋buff处理逻辑并添加vType支持
- 在TalSlot接口和talConf配置中添加vType字段区分数值型和百分比型buff - 重构HeroAttrsComp中BUFFS_TAL数据结构,改为以天赋uuid为key的映射 - 实现新的addTalBuff和clearTalBuff方法处理天赋buff - 在TalComp中添加BUFF类型天赋的触发处理
This commit is contained in:
@@ -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<number, ItalConf> = {
|
||||
/*** 普通攻击触发 ***/
|
||||
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次技能暴击"},
|
||||
|
||||
};
|
||||
|
||||
@@ -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<number, Array<{tal:number,value: number, BType: BType,count:number}>> = {};
|
||||
BUFFS_TAL: Record<number, {count:number,BType:BType,attrIndex:number,value: number}> = {};
|
||||
|
||||
// ==================== 技能距离缓存 ====================
|
||||
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,44 +465,7 @@ 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<number>();
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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 = {};
|
||||
|
||||
Reference in New Issue
Block a user