From 9a0dbaf41deafc7cf691d6817ea827b969e421de Mon Sep 17 00:00:00 2001 From: pan Date: Tue, 21 Jul 2026 10:19:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(skill&hero):=20=E6=B7=BB=E5=8A=A0=E5=87=BB?= =?UTF-8?q?=E9=80=80=E5=B1=9E=E6=80=A7=E9=85=8D=E7=BD=AE=E4=B8=8E=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 移除英雄配置注释里废弃属性的提示 2. 为小刺客技能添加击退概率覆盖参数 3. 补全技能系统中击退属性的计算逻辑 4. 修复代码格式与缩进问题 --- assets/script/game/common/config/heroSet.ts | 3 +- assets/script/game/skill/Skill.ts | 75 +++++++++++---------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 977942de..fbe6bac0 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -213,7 +213,6 @@ export interface HeroEvolve { * fend 辅助 每波结束触发,跨波次累积增益 * * 触发节奏:atked 3次/5次,atking 5次/7次,fstart/fend 1次/波 - * 废弃属性:frz(冰冻)、bck(击退) — 怪物固定不移动,无效 * * 设定中的英雄都是1级,最高可以升级到3级(不在列表内提现,升级在游戏内进行) * skills[0]是普通攻击技能 @@ -258,7 +257,7 @@ export const HeroInfo: Record = { // ========== atking 类 — 刺客(自身强化) ========== 5021: { uuid: 5021, name: "小刺客", path: "hc1", fac: FacSet.HERO, pool_lv: 1, lv: 1, type: HType.Melee, hp: 300, ap: 28, - skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } }, + skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0, overrides: { bck: 20 } } }, atking: [{ s_uuid: 6401, t_num: 5, overrides: { TGroup: TGroup.Self, ap: 8 } }], info: "每攻击5次永久提升自身攻击力8点" }, diff --git a/assets/script/game/skill/Skill.ts b/assets/script/game/skill/Skill.ts index a9576ad6..ce4670f8 100644 --- a/assets/script/game/skill/Skill.ts +++ b/assets/script/game/skill/Skill.ts @@ -101,14 +101,14 @@ export class Skill extends ecs.Entity { this.addComponents(SMoveDataComp); } load(startPos: Vec3, parent: Node, s_uuid: number, targetPos: Vec3, - caster:HeroViewComp,cAttrsComp:HeroAttrsComp, skill_lv:number=0, ext_dmg:number=0, overrides?: SkillOverrides) { + caster: HeroViewComp, cAttrsComp: HeroAttrsComp, skill_lv: number = 0, ext_dmg: number = 0, overrides?: SkillOverrides) { let config = SkillSet[s_uuid]; if (!config) { mLogger.error(this.debugMode, 'Skill', "[Skill] 技能配置不存在:", s_uuid); return; } config = mergeSkillParams(config, overrides); - + const path = `game/skill/atk/${config.sp_name}`; const initSkillNode = (prefab: Prefab) => { const node: Node = Skill.getFromPool(path) || instantiate(prefab); @@ -119,7 +119,7 @@ export class Skill extends ecs.Entity { this.prefabPath = path; this.skillNode = node; - + let skillParent: Node | null = null; if (smc.map && smc.map.MapView && smc.map.MapView.scene && smc.map.MapView.scene.entityLayer && smc.map.MapView.scene.entityLayer.node) { skillParent = smc.map.MapView.scene.entityLayer.node.getChildByName("SKILL"); @@ -127,18 +127,18 @@ export class Skill extends ecs.Entity { if (!skillParent || !skillParent.isValid) { skillParent = parent; } - + if (!skillParent || !skillParent.isValid) { - mLogger.error(this.debugMode, 'Skill', "[Skill] 父节点无效"); - if(node.isValid) node.destroy(); - return; + mLogger.error(this.debugMode, 'Skill', "[Skill] 父节点无效"); + if (node.isValid) node.destroy(); + return; } node.parent = skillParent; node.active = true; // 设置节点属性 - let face=caster.node.scale.x < 0 ? -1 : 1 - node.setScale(v3(Math.abs(node.scale.x)*face,node.scale.y,1)) + let face = caster.node.scale.x < 0 ? -1 : 1 + node.setScale(v3(Math.abs(node.scale.x) * face, node.scale.y, 1)) // 初始视图 const SView = node.getComponent(SkillView); if (!SView) { @@ -146,21 +146,21 @@ export class Skill extends ecs.Entity { if (node.isValid) node.destroy(); return; } - if(config.EType!=EType.collision){ - const collider=node.getComponent(BoxCollider2D); - if(collider){ - collider.enabled=false + if (config.EType != EType.collision) { + const collider = node.getComponent(BoxCollider2D); + if (collider) { + collider.enabled = false } } - + // 只设置必要的运行时属性,配置信息通过 SkillSet[uuid] 访问 - // 核心标识 - SView.s_uuid= s_uuid - SView.group= caster.box_group + // 核心标识 + SView.s_uuid = s_uuid + SView.group = caster.box_group this.add(SView); - startPos.x=startPos.x+SView.atk_x*face - startPos.y=startPos.y+SView.atk_y + startPos.x = startPos.x + SView.atk_x * face + startPos.y = startPos.y + SView.atk_y node.setPosition(startPos); @@ -179,7 +179,7 @@ export class Skill extends ecs.Entity { sMoveCom.bezierStartHeight = config.bezier_start_y ?? sMoveCom.bezierStartHeight; sMoveCom.bezierMidHeight = config.bezier_mid_y ?? sMoveCom.bezierMidHeight; sMoveCom.bezierArc = config.bezier_arc ?? sMoveCom.bezierArc; - // 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理 + // 从SkillView获取移动参数,位置初始化由SMoveSystem统一处理 sMoveCom.atk_x = SView.atk_x; sMoveCom.atk_y = SView.atk_y; @@ -199,30 +199,31 @@ export class Skill extends ecs.Entity { if (!sDataCom) { sDataCom = this.add(SDataCom); } - sDataCom.reset(); - sDataCom.group=caster.box_group - sDataCom.casterEid=caster.ent.eid + sDataCom.reset(); + sDataCom.group = caster.box_group + sDataCom.casterEid = caster.ent.eid sDataCom.Attrs = {}; - const SUp=SkillUpList[s_uuid] ? SkillUpList[s_uuid]:SkillUpList[1001]; - const sCrt = (config.crt ?? 0)+(SUp.crt*skill_lv); - const sFrz = (config.frz ?? 0)+(SUp.frz*skill_lv); - const sStun = (config.stun ?? 0)+(SUp.stun*skill_lv); - const sAp =config.ap+(SUp.ap*skill_lv); - const sHit=config.hit_count+(SUp.hit_count*skill_lv); - sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap*sAp/100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100,不然会出现ap为90%变0 + const SUp = SkillUpList[s_uuid] ? SkillUpList[s_uuid] : SkillUpList[1001]; + const sCrt = (config.crt ?? 0) + (SUp.crt * skill_lv); + const sFrz = (config.frz ?? 0) + (SUp.frz * skill_lv); + const sStun = (config.stun ?? 0) + (SUp.stun * skill_lv); + const sBck = (config.bck ?? 0) + (SUp.bck * skill_lv); + const sAp = config.ap + (SUp.ap * skill_lv); + const sHit = config.hit_count + (SUp.hit_count * skill_lv); + sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap * sAp / 100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100,不然会出现ap为90%变0 sDataCom.Attrs[Attrs.critical] = cAttrsComp.getRuntimeCritical() + sCrt; sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getRuntimeCritDamageBonus(); sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getRuntimeFreezeChance() + sFrz; sDataCom.Attrs[Attrs.stun_chance] = cAttrsComp.getRuntimeStunChance() + sStun; - sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance || 0; + sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance + sBck; sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.knockback_distance || 0; sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getRuntimePunctureChance(); // 初始化携带施法者的穿透概率 - sDataCom.s_uuid=s_uuid + sDataCom.s_uuid = s_uuid sDataCom.skill_lv = Math.max(0, skill_lv); - sDataCom.fac=cAttrsComp.fac - sDataCom.ext_dmg=ext_dmg + sDataCom.fac = cAttrsComp.fac + sDataCom.ext_dmg = ext_dmg sDataCom.hit_count = 0 - sDataCom.max_hit_count = Math.max(1,sHit) + sDataCom.max_hit_count = Math.max(1, sHit) SView.init(); }; @@ -248,10 +249,10 @@ export class Skill extends ecs.Entity { this.remove(SDataCom); this.remove(SMoveDataComp) this.remove(StimeDataComp) - + // 移除组件会触发 reset,但我们在 reset 中移除了 destroy this.remove(SkillView) - + // 回收节点到对象池 if (this.skillNode && this.skillNode.isValid && this.prefabPath) { Skill.putToPool(this.prefabPath, this.skillNode);