fix(英雄): 修复复活配置类型错误并优化复活流程

将 HeroAttrsComp 和 heroSet 中的 revive 字段从数组类型改为单一对象类型,因为每个英雄只能配置一个复活技能。同时优化 HeroAtkSystem 中的复活逻辑,将技能配置提取到变量中复用,并延迟 0.5 秒执行 alive() 方法以确保复活动画能够完整播放。
This commit is contained in:
panw
2026-04-23 15:02:39 +08:00
parent bca97070d4
commit 062ce6eb5c
3 changed files with 20 additions and 12 deletions

View File

@@ -70,7 +70,7 @@ export interface heroInfo {
field?:number[]; // 驻场技能uuid列表英雄在场时对全局生效
atking?:{s_uuid:number, t_num:number}[]; // 普通攻击后触发的技能配置s_uuid: 技能id, t_num: 触发所需的普攻次数
atked?:{s_uuid:number, t_num:number}[]; // 受击后触发的技能配置s_uuid: 技能id, t_num: 触发所需的受击次数
revive?:{s_uuid:number,r_num:number,upr:number}[]
revive?:{s_uuid:number,r_num:number,upr:number};
// dis: number; // 攻击距离(像素)
speed: number; // 移动速度(像素/秒)
skills: Record<number, HSkillInfo> ; // 携带技能ID列表
@@ -115,7 +115,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// ========== 法师英雄 ==========
5101:{uuid:5101,name:"奥术法师",path:"hm2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:50,ap:60,speed:800,revive:[{s_uuid:6501,r_num:1,upr:0.5}],
5101:{uuid:5101,name:"奥术法师",path:"hm2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:50,ap:60,speed:800,revive:{s_uuid:6501,r_num:1,upr:0.5},
skills:{6201:{uuid:6007,lv:1,cd:1,ccd:0}},info:"冰球,冰锥 远法dps"},
5102:{uuid:5102,name:"火焰法师",path:"hm1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:30,ap:120,speed:800,
skills:{6203:{uuid:6002,lv:1,cd:1,ccd:0}},info:"火击,火球 远法dps"},

View File

@@ -194,15 +194,16 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
let canRevive = false;
let maxReviveCount = 0;
let reviveHpPercent = 50; // 默认恢复50%
if (TAttrsComp.revive && TAttrsComp.revive.length > 0) {
const reviveConf = TAttrsComp.revive[0];
let reviveSkillConf: any = null; // 提取出来的复活技能配置
if (TAttrsComp.revive) {
const reviveConf = TAttrsComp.revive;
maxReviveCount = reviveConf.r_num + Math.floor((TAttrsComp.lv - 1) * reviveConf.upr);
if (TAttrsComp.revived_count < maxReviveCount) {
canRevive = true;
// 从配置表中读取对应的复活技能配置ap 字段代表恢复生命值的百分比
const skillConf = SkillSet[reviveConf.s_uuid];
if (skillConf && skillConf.ap) {
reviveHpPercent = skillConf.ap;
reviveSkillConf = SkillSet[reviveConf.s_uuid];
if (reviveSkillConf && reviveSkillConf.ap) {
reviveHpPercent = reviveSkillConf.ap;
}
}
}
@@ -215,10 +216,17 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
TAttrsComp.dirty_hp = true;
// 触发复活动画
if (targetView) {
targetView.alive()
targetView.playReady(skillConf.readyAnm);
targetView.skill_name('',skillConf.uuid)
if (targetView && reviveSkillConf) {
targetView.playReady(reviveSkillConf.readyAnm);
targetView.skill_name('', reviveSkillConf.uuid);
// 延迟 0.5 秒后恢复状态,让特效有时间播放,同时也能体现“正在复活”的过程
targetView.scheduleOnce(() => {
if (targetView.node && targetView.node.isValid) {
targetView.alive();
}
}, 0.5);
} else if (targetView) {
targetView.alive();
}
mLogger.log(this.debugMode, 'HeroAtkSystem', ` Hero waiting to revive! Lives revived: ${TAttrsComp.revived_count}/${maxReviveCount}, Hp restored: ${reviveHpPercent}%`);
return reDate;

View File

@@ -34,7 +34,7 @@ export class HeroAttrsComp extends ecs.Comp {
fend?: number[];
atking?: {s_uuid: number, t_num: number}[];
atked?: {s_uuid: number, t_num: number}[];
revive?: {s_uuid: number, r_num: number, upr: number}[];
revive?: {s_uuid: number, r_num: number, upr: number};
// ==================== 特殊属性 ====================
critical: number = 0; // 暴击率