feat(战斗系统): 实现攻击和技能伤害加成天赋效果

添加ATK_DMG和SKILL_DMG天赋类型,支持在普通攻击和技能释放时应用额外伤害
修改SACastSystem以处理不同类型的伤害加成
重构TalEffet枚举并更新相关配置
This commit is contained in:
2025-11-24 15:39:05 +08:00
parent 4ed531e100
commit 8d2ec76b01
4 changed files with 57 additions and 25 deletions

View File

@@ -18,19 +18,20 @@ export enum TriType {
export enum TalEffet { export enum TalEffet {
DMG=1, // 伤害 ATK_DMG=1, // 伤害
HP=2, // 回血 百分比 SKILL_DMG=2, // 技能伤害
MP=3, //回蓝 百分比 HP=3, // 回血 百分比
BUFF = 4, // 暴击率,闪避率等,可叠加的触发后清零 MP=4, //回蓝 百分比
STATS=5, // 状态 BUFF = 5, // 暴击率,闪避率等,可叠加的触发后清零
WFUNY=6, // 风怒 STATS=6, // 状态
SPLASH=7, // 溅射 WFUNY=7, // 风怒
D_SKILL=8, //两次技能 SPLASH=8, // 溅射
SHIELD=9, // 护盾 D_SKILL=9, //两次技能
LDMG=10, // 减伤 SHIELD=10, // 护盾
C_ATK=11, // 普工必爆 LDMG=11, // 减伤
C_SKILL=12, // 一般技能必暴 C_ATK=12, // 普工必爆
C_MSKILL=13, // 必杀技能必暴 C_SKILL=13, // 一般技能必暴
C_MSKILL=14, // 必杀技能必暴
} }
export enum TalTarget { export enum TalTarget {
@@ -107,7 +108,7 @@ export const talConf: Record<number, ItalConf> = {
desc:"普通攻击10次后, 下次一般技能额外释放1次,伤害100%"}, desc:"普通攻击10次后, 下次一般技能额外释放1次,伤害100%"},
/*** 受伤触发 ***/ /*** 受伤触发 ***/
7101:{uuid:7101,name:"反击",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.ENEMY,effet:TalEffet.DMG,vType:BType.RATIO, value:50,attrs:TalAttrs.NON, 7101:{uuid:7101,name:"反击",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.ENEMY,effet:TalEffet.ATK_DMG,vType:BType.RATIO, value:50,attrs:TalAttrs.NON,
desc:"被攻击3次后, 给于目标50%的伤害"}, desc:"被攻击3次后, 给于目标50%的伤害"},
7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.SELF,effet:TalEffet.SHIELD,vType:BType.RATIO, value:20,attrs:TalAttrs.NON, 7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.SELF,effet:TalEffet.SHIELD,vType:BType.RATIO, value:20,attrs:TalAttrs.NON,
desc:"被攻击3次后, 获得20%的生命值护盾"}, desc:"被攻击3次后, 获得20%的生命值护盾"},

View File

@@ -433,6 +433,12 @@ export class HeroAttrsComp extends ecs.Comp {
t.count -= 1; t.count -= 1;
return true; return true;
} }
useCountValTal(eff: number): number {
const t = this.Talents[eff];
if (!t || t.value <= 0) return 0;
t.count -= 1;
return t.value;
}
useValueTalByUuid(t_uuid: number) { useValueTalByUuid(t_uuid: number) {
const buff = this.BUFFS_TAL[t_uuid]; const buff = this.BUFFS_TAL[t_uuid];
if (!buff) return; if (!buff) return;

View File

@@ -157,24 +157,34 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
return false; return false;
} }
// 2. 延迟创建技能实体(等待动画) // 2. 延迟创建技能实体(等待动画)
const delay = 0.3 if (hset === HSSet.atk){
let delay = 0.3
let ext_dmg = heroAttrs.useCountValTal(TalEffet.ATK_DMG);
heroView.scheduleOnce(() => { heroView.scheduleOnce(() => {
this.createSkill(s_uuid, heroView,targets); this.createSkill(s_uuid, heroView,targets,ext_dmg);
}, delay); }, delay);
}
if(hset === HSSet.skill){
let delay = 0.3
let ext_dmg = heroAttrs.useCountValTal(TalEffet.SKILL_DMG);
heroView.scheduleOnce(() => {
this.createSkill(s_uuid, heroView,targets,ext_dmg);
}, delay);
}
//风怒wfuny 只针对 普通攻击起效 //风怒wfuny 只针对 普通攻击起效
if (hset === HSSet.atk && heroAttrs.useCountTal(TalEffet.WFUNY)){ if (hset === HSSet.atk && heroAttrs.useCountTal(TalEffet.WFUNY)){
let delay = 0.3
heroView.playSkillEffect(s_uuid); heroView.playSkillEffect(s_uuid);
//需要再添加 风怒动画 //需要再添加 风怒动画
heroView.scheduleOnce(() => {
this.createSkill(s_uuid, heroView,targets); this.createSkill(s_uuid, heroView,targets);
},delay);
} }
// 双技能 只针对 技能起效 // 双技能 只针对 技能起效
if(hset === HSSet.skill && heroAttrs.useCountTal(TalEffet.D_SKILL)){ if(hset === HSSet.skill && heroAttrs.useCountTal(TalEffet.D_SKILL)){
targets = this.sTargets(heroView, s_uuid); let delay = 0.3
if (targets.length === 0) {
console.warn("[SACastSystem] 没有找到有效目标");
return false;
}
heroView.playSkillEffect(s_uuid); heroView.playSkillEffect(s_uuid);
//需要再添加 双技能动画 //需要再添加 双技能动画
heroView.scheduleOnce(() => { heroView.scheduleOnce(() => {

View File

@@ -202,6 +202,21 @@ export class TalComp extends ecs.Comp {
const talent = this.Tals[uuid]; const talent = this.Tals[uuid];
const heroAttrs=this.ent.get(HeroAttrsComp); const heroAttrs=this.ent.get(HeroAttrsComp);
switch(talent.effet){ 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.addCountTal(TalEffet.HP, talent.value + talent.value_add);
// break;
// case TalEffet.MP:
// heroAttrs.addCountTal(TalEffet.MP, talent.value + talent.value_add);
// break;
case TalEffet.WFUNY: case TalEffet.WFUNY:
heroAttrs.addCountTal(TalEffet.WFUNY, talent.value + talent.value_add); heroAttrs.addCountTal(TalEffet.WFUNY, talent.value + talent.value_add);
break; break;