feat(hero): 新增英雄等级进化配置与属性技能变更逻辑

实现了英雄从2级开始的等级进化系统,支持替换普攻技能、覆盖各类触发技能、添加额外属性加成,同时在英雄配置中添加了进化配置的类型定义与示例配置
This commit is contained in:
walkpan
2026-05-28 22:27:38 +08:00
parent 9ddf5b99c5
commit 62a92ab9b6
2 changed files with 66 additions and 0 deletions

View File

@@ -147,6 +147,7 @@ export interface heroInfo {
dis?: number; // 攻击距离(像素) dis?: number; // 攻击距离(像素)
speed?: number; // 移动速度(像素/秒) speed?: number; // 移动速度(像素/秒)
skills: Record<number, HSkillInfo> ; // 携带技能ID列表 skills: Record<number, HSkillInfo> ; // 携带技能ID列表
evolve?: Record<number, HeroEvolve>; // 等级进化配置key=等级(2,3,...)
info: string; // 描述文案 info: string; // 描述文案
} }
/** /**
@@ -159,6 +160,24 @@ export interface HSkillInfo {
ccd:number; // 占位当前cd用于cd计时 ccd:number; // 占位当前cd用于cd计时
overrides?: SkillOverrides; // 角色专属参数覆盖 overrides?: SkillOverrides; // 角色专属参数覆盖
} }
/**
* 英雄等级进化配置
* 定义英雄在某等级时技能/属性的变化
*/
export interface HeroEvolve {
/** 替换普攻技能(清除旧技能,添加新技能) */
skill?: { s_uuid: number; cd?: number; overrides?: SkillOverrides };
/** 覆盖触发技能(完全替换该类型的触发配置) */
atking?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[];
atked?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[];
dead?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[];
fstart?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[];
fend?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[];
revive?: { s_uuid: number; r_num: number; upr: number };
/** 额外属性加成(在等级倍率基础上叠加) */
ap_bonus?: number;
hp_bonus?: number;
}
/* /*
*=============英雄配置列表================ *=============英雄配置列表================
* 职业触发规则 (v3) * 职业触发规则 (v3)
@@ -217,6 +236,11 @@ export const HeroInfo: Record<number, heroInfo> = {
hp:450,ap:25, hp:450,ap:25,
skills:{6001:{uuid:6001,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}}, skills:{6001:{uuid:6001,lv:1,cd:AtkSpeedSet[AtkSpeedLv.VerySlow1].cd,ccd:0}},
atked:[{s_uuid:6301,t_num:2}], atked:[{s_uuid:6301,t_num:2}],
evolve:{
2:{atked:[{s_uuid:6301,t_num:1,overrides:{TGroup:TGroup.Team,ap:3,hit_count:3}}]},
3:{atked:[{s_uuid:6301,t_num:1,overrides:{TGroup:TGroup.Team,ap:5,hit_count:5}}],
dead:[{s_uuid:6402,t_num:1,overrides:{ap:40}}],ap_bonus:20,hp_bonus:200},
},
info:"高血量坦克受击2次自动加护盾"}, info:"高血量坦克受击2次自动加护盾"},
5008:{uuid:5008,name:"守护骑士",path:"hk2", fac:FacSet.HERO,pool_lv:3,lv:1,type:HType.Melee, 5008:{uuid:5008,name:"守护骑士",path:"hk2", fac:FacSet.HERO,pool_lv:3,lv:1,type:HType.Melee,
@@ -250,6 +274,12 @@ export const HeroInfo: Record<number, heroInfo> = {
skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow1].cd,ccd:0}}, skills:{6007:{uuid:6007,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Slow1].cd,ccd:0}},
field:[6405], field:[6405],
atking:[{s_uuid:6405,t_num:2}], atking:[{s_uuid:6405,t_num:2}],
evolve:{
2:{atking:[{s_uuid:6105,t_num:3,overrides:{ap:100,frz:20}}]},
3:{skill:{s_uuid:6105,overrides:{frz:15,hit_count:6}},
atking:[{s_uuid:6105,t_num:1,overrides:{ap:150,frz:35,hit_count:8}}],
ap_bonus:30},
},
info:"驻场提供冰冻光环每2次普攻叠加冰冻概率"}, info:"驻场提供冰冻光环每2次普攻叠加冰冻概率"},
5107:{uuid:5107,name:"霜寒法师",path:"hm5", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long, 5107:{uuid:5107,name:"霜寒法师",path:"hm5", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long,
@@ -282,6 +312,11 @@ export const HeroInfo: Record<number, heroInfo> = {
hp:120,ap:40, hp:120,ap:40,
skills:{6004:{uuid:6004,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Mid1].cd,ccd:0}}, skills:{6004:{uuid:6004,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Mid1].cd,ccd:0}},
atking:[{s_uuid:6302,t_num:2}], atking:[{s_uuid:6302,t_num:2}],
evolve:{
2:{atking:[{s_uuid:6302,t_num:1,overrides:{ap:250}}]},
3:{atking:[{s_uuid:6302,t_num:1,overrides:{ap:400}}],
revive:{s_uuid:6501,r_num:1,upr:0.5},hp_bonus:100},
},
info:"每2次普攻后治疗全队恢复攻击力300%的生命值"}, info:"每2次普攻后治疗全队恢复攻击力300%的生命值"},
5304:{uuid:5304,name:"神圣医师",path:"hh2", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long, 5304:{uuid:5304,name:"神圣医师",path:"hh2", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long,

View File

@@ -159,6 +159,37 @@ export class Hero extends ecs.Entity {
// 最终技能等级 = 初始技能等级 + 英雄等级增量,且下限为 0 // 最终技能等级 = 初始技能等级 + 英雄等级增量,且下限为 0
model.skills[skill.uuid] = { ...skill, lv: Math.max(0,skill.lv + hero_lv - 2), ccd: 0 }; model.skills[skill.uuid] = { ...skill, lv: Math.max(0,skill.lv + hero_lv - 2), ccd: 0 };
} }
// 应用等级进化配置(从 lv2 开始逐级覆盖)
if (hero.evolve) {
for (let elv = 2; elv <= hero_lv; elv++) {
const evo = hero.evolve[elv];
if (!evo) continue;
// 替换普攻技能
if (evo.skill) {
const oldSkill = Object.values(model.skills)[0];
model.skills = {};
model.skills[evo.skill.s_uuid] = {
uuid: evo.skill.s_uuid,
lv: Math.max(0, 1 + hero_lv - 2),
cd: evo.skill.cd ?? oldSkill?.cd ?? 1,
ccd: 0,
overrides: evo.skill.overrides,
};
}
// 覆盖触发技能
if (evo.atking) model.atking = evo.atking;
if (evo.atked) model.atked = evo.atked;
if (evo.dead) model.dead = evo.dead;
if (evo.fstart) model.fstart = evo.fstart;
if (evo.fend) model.fend = evo.fend;
if (evo.revive) model.revive = evo.revive;
// 额外属性加成
if (evo.ap_bonus) model.ap += evo.ap_bonus;
if (evo.hp_bonus) { model.hp += evo.hp_bonus; model.hp_max += evo.hp_bonus; }
}
}
// 缓存技能射程等派生数据,减少战斗帧内重复计算 // 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache(); model.updateSkillDistanceCache();