feat(hero): 新增英雄等级进化配置与属性技能变更逻辑
实现了英雄从2级开始的等级进化系统,支持替换普攻技能、覆盖各类触发技能、添加额外属性加成,同时在英雄配置中添加了进化配置的类型定义与示例配置
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user