refactor(skill/hero): 重构技能buff系统,优化属性处理与技能加成逻辑
- 新增HeroAttrsComp的add_special_attr方法,实现动态累加任意数字类型的英雄属性 - 废弃旧的BuffConf数组配置格式,改用单一buff_type字段简化技能buff配置 - 修复金币类技能加成未随技能等级提升的问题,调整计算逻辑为baseGold + sUp.ap * skillLv - 重构applyActualFriendlyEffect方法,添加技能等级参数,按buff类型匹配对应升级加成 - 更新所有内置技能配置为新的格式规范
This commit is contained in:
@@ -102,11 +102,7 @@ export enum IType {
|
||||
export const HeroSkillList = [6001,6001,6001,6001,6001,6001]
|
||||
|
||||
// Debuff配置接口
|
||||
|
||||
export interface BuffConf {
|
||||
buff:Attrs;
|
||||
value:number; // 效果值
|
||||
}
|
||||
// (已被废弃,采用平铺字段 buff_type 和 buff_value 代替)
|
||||
|
||||
interface IReady {
|
||||
uuid:number,
|
||||
@@ -155,7 +151,7 @@ export interface SkillConfig {
|
||||
crt?:number, // 额外暴击率
|
||||
frz?:number, // 额外冰冻概率
|
||||
bck?:number, // 额外击退概率
|
||||
buffs:BuffConf[], // 对目标应用的 buff 配置列表
|
||||
buff_type?:Attrs, // Buff 类型 (单一职责)
|
||||
call_hero?:number, // 召唤技能召唤英雄id(可选)
|
||||
info:string, // 技能描述
|
||||
}
|
||||
@@ -169,7 +165,7 @@ export interface SkillOverrides {
|
||||
crt?: number;
|
||||
frz?: number;
|
||||
bck?: number;
|
||||
buffs?: BuffConf[];
|
||||
buff_type?: Attrs;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -202,123 +198,123 @@ export const SkillSet: Record<number, SkillConfig> = {
|
||||
6001: {
|
||||
uuid:6001,name:"普通攻击",sp_name:"atk",icon:"1026",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.Melee,
|
||||
RType:RType.linear,EType:EType.collision,buffs:[],info:"造成攻击力100%的伤害",
|
||||
RType:RType.linear,EType:EType.collision,info:"造成攻击力100%的伤害",
|
||||
},
|
||||
6002: {
|
||||
uuid:6002,name:"光箭蓝",sp_name:"atk_c1",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,buffs:[],info:"近战普通攻击技能",
|
||||
RType:RType.bezier,EType:EType.collision,info:"近战普通攻击技能",
|
||||
},
|
||||
6003: {
|
||||
uuid:6003,name:"光箭红",sp_name:"atk_c2",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,buffs:[],info:"一定几率暴击",
|
||||
RType:RType.bezier,EType:EType.collision,info:"一定几率暴击",
|
||||
},
|
||||
6004: {
|
||||
uuid:6004,name:"光箭绿",sp_name:"atk_c3",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,buffs:[],info:"一定几率击退目标",
|
||||
RType:RType.bezier,EType:EType.collision,info:"一定几率击退目标",
|
||||
},
|
||||
//怪物战士类型统一使用 6005
|
||||
6005: {
|
||||
uuid:6005,name:"光箭深红",sp_name:"atk_c4",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,buffs:[],info:"一定几率击退目标",
|
||||
RType:RType.bezier,EType:EType.collision,info:"一定几率击退目标",
|
||||
},
|
||||
6006: {
|
||||
uuid:6006,name:"光箭灰白",sp_name:"atk_c5",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,buffs:[],info:"一定几率击退目标",
|
||||
RType:RType.bezier,EType:EType.collision,info:"一定几率击退目标",
|
||||
},
|
||||
6007: {
|
||||
uuid:6007,name:"水球",sp_name:"ball_water",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,buffs:[],info:"一定几率冰冻目标",
|
||||
RType:RType.bezier,EType:EType.collision,info:"一定几率冰冻目标",
|
||||
},
|
||||
6008: {
|
||||
uuid:6008,name:"箭矢",sp_name:"arrow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,bezier_start_y:20,bezier_mid_y:140,bezier_arc:1.05,buffs:[],info:"造成攻击力100%的伤害",
|
||||
RType:RType.bezier,EType:EType.collision,bezier_start_y:20,bezier_mid_y:140,bezier_arc:1.05,info:"造成攻击力100%的伤害",
|
||||
},
|
||||
6009: {
|
||||
uuid:6009,name:"箭矢蓝",sp_name:"arrow_blue",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,bezier_start_y:20,bezier_mid_y:140,bezier_arc:1.05,buffs:[],info:"造成攻击力100%的伤害",
|
||||
RType:RType.bezier,EType:EType.collision,bezier_start_y:20,bezier_mid_y:140,bezier_arc:1.05,info:"造成攻击力100%的伤害",
|
||||
},
|
||||
6010: {
|
||||
uuid:6010,name:"箭矢红",sp_name:"arrow_red",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.bezier,EType:EType.collision,bezier_start_y:20,bezier_mid_y:140,bezier_arc:1.05,buffs:[],info:"造成攻击力100%的伤害",
|
||||
RType:RType.bezier,EType:EType.collision,bezier_start_y:20,bezier_mid_y:140,bezier_arc:1.05,info:"造成攻击力100%的伤害",
|
||||
},
|
||||
|
||||
6101: {
|
||||
uuid:6101,name:"火球",sp_name:"ball_fire",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,frz:0,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.linear,EType:EType.collision,buffs:[],info:"造成攻击力100%的伤害,一定几率暴击,高阶技能",
|
||||
RType:RType.linear,EType:EType.collision,info:"造成攻击力100%的伤害,一定几率暴击,高阶技能",
|
||||
},
|
||||
6102: {
|
||||
uuid:6102,name:"龙卷风",sp_name:"ball_winds",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.linear,EType:EType.collision,buffs:[],info:"造成攻击力100%的伤害,一定几率击退目标,高阶技能",
|
||||
RType:RType.linear,EType:EType.collision,info:"造成攻击力100%的伤害,一定几率击退目标,高阶技能",
|
||||
},
|
||||
//怪物法师统一使用 暗影球
|
||||
6103: {
|
||||
uuid:6103,name:"暗影球",sp_name:"ball_zi",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.linear,EType:EType.collision,buffs:[],info:"造成攻击力100%的伤害,一定几率上毒(后期加入),高阶技能 ",
|
||||
RType:RType.linear,EType:EType.collision,info:"造成攻击力100%的伤害,一定几率上毒(后期加入),高阶技能 ",
|
||||
},
|
||||
6104: {
|
||||
uuid:6104,name:"穿云箭",sp_name:"arrow_big_yellow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"yellow",endAnm:"",act:"max",
|
||||
DTType:DTType.single,crt:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.linear,EType:EType.collision,buffs:[],info:"射出强力箭矢,最多穿透6个敌人,附带20%额外暴击率",
|
||||
RType:RType.linear,EType:EType.collision,info:"射出强力箭矢,最多穿透6个敌人,附带20%额外暴击率",
|
||||
},
|
||||
6105: {
|
||||
uuid:6105,name:"冰刺",sp_name:"ice_up",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"max",
|
||||
DTType:DTType.range,frz:0,ap:150,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.fixedEnd,EType:EType.animationEnd,buffs:[],info:"召唤冰刺攻击一排的敌人,有概率冰冻",
|
||||
RType:RType.fixedEnd,EType:EType.animationEnd,info:"召唤冰刺攻击一排的敌人,有概率冰冻",
|
||||
},
|
||||
6106: {
|
||||
uuid:6106,name:"冰推",sp_name:"ice_t",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"max",
|
||||
DTType:DTType.range,frz:0,ap:150,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"召唤冰墙阻挡敌人,有概率冰冻,100%击退",
|
||||
RType:RType.fixed,EType:EType.animationEnd,info:"召唤冰墙阻挡敌人,有概率冰冻,100%击退",
|
||||
},
|
||||
6107: {
|
||||
uuid:6107,name:"陨石",sp_name:"fire_yuns",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"reds",endAnm:"",act:"max",
|
||||
DTType:DTType.range,crt:20,ap:150,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
|
||||
RType:RType.fixedEnd,EType:EType.animationEnd,buffs:[],info:"召唤攻击敌人,造成攻击力150%的范围伤害,附带20%额外暴击率",
|
||||
RType:RType.fixedEnd,EType:EType.animationEnd,info:"召唤攻击敌人,造成攻击力150%的范围伤害,附带20%额外暴击率",
|
||||
},
|
||||
|
||||
//============================= ====== 辅助技能 ====== ==========================
|
||||
6301:{
|
||||
uuid:6301,name:"护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_blue",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,kind:SkillKind.Shield,ap:3,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"为伙伴/自己添加护盾,可抵挡3次伤害",
|
||||
RType:RType.fixed,EType:EType.animationEnd,info:"为伙伴/自己添加护盾,可抵挡3次伤害",
|
||||
},
|
||||
6302: {
|
||||
uuid:6302,name:"治疗",sp_name:"buff_wind",icon:"1292",TGroup:TGroup.Team,readyAnm:"up_green",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,kind:SkillKind.Heal,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"治疗伙伴/自己",
|
||||
RType:RType.fixed,EType:EType.animationEnd,info:"治疗伙伴/自己",
|
||||
},
|
||||
6303: {
|
||||
uuid:6303,name:"获取金币",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_blue",endAnm:"gold",act:"atk",
|
||||
DTType:DTType.single,kind:SkillKind.Gold,ap:0,gold:10,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"增加一定数量的金币",
|
||||
RType:RType.fixed,EType:EType.animationEnd,info:"增加一定数量的金币",
|
||||
},
|
||||
//==========================buff 技能=====================
|
||||
6401:{
|
||||
uuid:6401,name:"攻击强化",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_ap",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:5}],info:"全体友方攻击力提升5点,持续1次",
|
||||
DTType:DTType.single,kind:SkillKind.Support,ap:5,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buff_type:Attrs.ap,info:"全体友方攻击力提升5点,持续1次",
|
||||
},
|
||||
6402:{
|
||||
uuid:6402,name:"生命强化",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_hp",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.hp_max,value:20}],info:"全体友方最大生命值提升20点,持续1次",
|
||||
DTType:DTType.single,kind:SkillKind.Support,ap:20,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buff_type:Attrs.hp_max,info:"全体友方最大生命值提升20点,持续1次",
|
||||
},
|
||||
6501:{
|
||||
uuid:6501,name:"复活",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_ap",endAnm:"",act:"atk",
|
||||
DTType:DTType.single,kind:SkillKind.Support,ap:50,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.support,
|
||||
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"ap 代表复活的生命值百分比",
|
||||
RType:RType.fixed,EType:EType.animationEnd,info:"ap 代表复活的生命值百分比",
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -6,6 +6,7 @@ import { FacSet, FightSet } from "../common/config/GameSet";
|
||||
import { FieldSkillSet, FieldSkillType, SkillOverrides } from "../common/config/SkillSet";
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
import { TalentConfig, TalentType } from "../common/config/TalentSet";
|
||||
import { Attrs } from "../common/config/HeroAttrs";
|
||||
import { FieldSkillHelper } from "./FieldSkillHelper";
|
||||
@ecs.register('HeroAttrs')
|
||||
export class HeroAttrsComp extends ecs.Comp {
|
||||
@@ -135,6 +136,25 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
return value
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一的特殊/固定属性数值增加方法
|
||||
* @param attr_type 属性类型枚举
|
||||
* @param value 增加的数值
|
||||
*/
|
||||
add_special_attr(attr_type: Attrs, value: number) {
|
||||
// 利用枚举值(字符串)与类属性名一致的特性,动态访问并累加属性
|
||||
const key = attr_type as keyof this;
|
||||
|
||||
// 确保目标属性存在且类型为数字,避免运行时错误
|
||||
if (typeof this[key] === 'number') {
|
||||
(this as any)[key] += value;
|
||||
} else {
|
||||
if (this.debugMode) {
|
||||
mLogger.log(this.debugMode, 'HeroAttrs', `未找到对应数字属性或无法累加: attr_type=${attr_type}, value=${value}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
toFrost(time: number=1) {
|
||||
const frostTime = FightSet.FROST_TIME * time;
|
||||
|
||||
@@ -412,13 +412,13 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
: this.pickRandomFriendlyTargets(targets, sHit);
|
||||
|
||||
for (const target of applyTargets) {
|
||||
this.applyActualFriendlyEffect(target, kind, sAp, _cAttrsComp, config, sUp);
|
||||
this.applyActualFriendlyEffect(target, kind, sAp, _cAttrsComp, config, sUp, _skillLv);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private applyActualFriendlyEffect(target: HeroViewComp, kind: SkillKind, sAp: number, _cAttrsComp: HeroAttrsComp, config: SkillConfig, sUp: any) {
|
||||
private applyActualFriendlyEffect(target: HeroViewComp, kind: SkillKind, sAp: number, _cAttrsComp: HeroAttrsComp, config: SkillConfig, sUp: any, _skillLv: number = 1) {
|
||||
if (!target.ent) return;
|
||||
const model = target.ent.get(HeroAttrsComp);
|
||||
if (!model || model.is_dead) return;
|
||||
@@ -440,23 +440,35 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
model.add_shield(addShield);
|
||||
} else if (kind === SkillKind.Gold) {
|
||||
const baseGold = config.gold ?? config.ap;
|
||||
const addGold = baseGold + (sUp.ap);
|
||||
const addGold = baseGold + (sUp.ap * _skillLv);
|
||||
if (addGold > 0) {
|
||||
MissionEconomy.addCoin(addGold);
|
||||
}
|
||||
}
|
||||
if (!config.buffs || config.buffs.length === 0) return;
|
||||
for (const buffConf of config.buffs) {
|
||||
if (!buffConf) continue;
|
||||
const sBuffAp=buffConf.value+sUp.buff_ap
|
||||
const sBuffHp=buffConf.value+sUp.buff_hp
|
||||
switch (buffConf.buff){
|
||||
|
||||
if (config.buff_type !== undefined) {
|
||||
const baseValue = config.ap;
|
||||
let upgradeValue = 0;
|
||||
|
||||
// 根据 buff 类型选择对应的升级加成
|
||||
if (config.buff_type === Attrs.ap) upgradeValue = sUp.buff_ap || 0;
|
||||
else if (config.buff_type === Attrs.hp_max) upgradeValue = sUp.buff_hp || 0;
|
||||
else if (config.buff_type === Attrs.critical) upgradeValue = sUp.crt || 0;
|
||||
// 如果后续有冰冻等,在这里加上对应的 sUp 字段即可,如 sUp.frz
|
||||
|
||||
const totalBuffValue = baseValue + upgradeValue;
|
||||
|
||||
switch (config.buff_type){
|
||||
case Attrs.ap:
|
||||
model.add_ap(sBuffAp)
|
||||
break
|
||||
model.add_ap(totalBuffValue);
|
||||
break;
|
||||
case Attrs.hp_max:
|
||||
model.add_hp_max(sBuffHp)
|
||||
break
|
||||
model.add_hp_max(totalBuffValue);
|
||||
break;
|
||||
default:
|
||||
// 除了 hp_max 和 ap,其他固定属性走统一的 add_special_attr 方法
|
||||
model.add_special_attr(config.buff_type, totalBuffValue);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user