From 4706a128f3a7bf7638fb0062dde512cfb596b037 Mon Sep 17 00:00:00 2001 From: panw Date: Fri, 17 Oct 2025 18:41:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor(buff):=20=E7=BB=9F=E4=B8=80buff?= =?UTF-8?q?=E5=92=8Cdebuff=E5=B1=9E=E6=80=A7=E7=BB=93=E6=9E=84=E5=8F=8A?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增Buff类型枚举BType,区分数值型与百分比型属性 - 定义AttrsType,映射每个属性的类型(数值或百分比) - 添加辅助方法isRatioAttr和getAttrType用于属性类型判断 - HeroViewComp中buff和debuff相关属性名称重新命名,区分持久型和临时型及属性类型 - 修改buff/debuff的加载、应用、更新逻辑,适配新的属性结构 - 新增HeroViewComp的isStun和isFrost方法判断状态 - BattleMoveSystem中使用新判断方法替代旧列表遍历 - 移除SkillCom中未使用的BuffAttr导入项,优化依赖关系 --- assets/script/game/common/config/SkillSet.ts | 79 ++++++++++-- .../common/ecs/position/BattleMoveSystem.ts | 4 +- assets/script/game/hero/HeroViewComp.ts | 114 +++++++++--------- assets/script/game/skills/SkillCom.ts | 2 +- 4 files changed, 131 insertions(+), 68 deletions(-) diff --git a/assets/script/game/common/config/SkillSet.ts b/assets/script/game/common/config/SkillSet.ts index 9ac6d359..c0151182 100644 --- a/assets/script/game/common/config/SkillSet.ts +++ b/assets/script/game/common/config/SkillSet.ts @@ -146,8 +146,9 @@ export enum Attrs { SPEED = 27, //移动速度加成,默认都是百分比 } + export const getAttrs=()=>{ - // 遍历枚举的数字值(枚举会生成双向映射) + // 遍历枚举的数字值(枚举会生成双向映射) let reAttrs = {}; Object.keys(Attrs).forEach(key => { if (!isNaN(Number(key))) { @@ -157,6 +158,74 @@ export const getAttrs=()=>{ return reAttrs; } +/** + * Buff类型枚举 + * VALUE: 数值型 - 直接加减数值 + * RATIO: 百分比型 - 按百分比计算 + */ +export enum BType { + VALUE=0, //数值型 + RATIO=1 //百分比型 +} + +/** + * 属性类型配置表 + * 用于区分每个属性是数值型还是百分比型 + * - VALUE: 数值型属性(如生命值、攻击力等绝对数值) + * - RATIO: 百分比型属性(如暴击率、闪避率等百分比数值) + */ +export const AttrsType: Record = { + // ========== 数值型属性 ========== + [Attrs.HP_MAX]: BType.VALUE, // 最大生命值 - 数值型 + [Attrs.MP_MAX]: BType.VALUE, // 最大魔法值 - 数值型 + [Attrs.SHIELD_MAX]: BType.VALUE, // 最大护盾值 - 数值型 + [Attrs.AP]: BType.VALUE, // 攻击力 - 数值型 + [Attrs.MAP]: BType.VALUE, // 魔法攻击力 - 数值型 + [Attrs.DEF]: BType.VALUE, // 防御 - 数值型 + [Attrs.MDEF]: BType.VALUE, // 魔法防御 - 数值型 + [Attrs.DIS]: BType.VALUE, // 攻击距离 - 数值型 + + // ========== 百分比型属性 ========== + [Attrs.CRITICAL]: BType.RATIO, // 暴击率 - 百分比型 + [Attrs.CRITICAL_DMG]: BType.RATIO, // 暴击伤害 - 百分比型 + [Attrs.DODGE]: BType.RATIO, // 闪避 - 百分比型 + [Attrs.HIT]: BType.RATIO, // 命中 - 百分比型 + [Attrs.WFUNY]: BType.RATIO, // 风怒 - 百分比型 + [Attrs.AS]: BType.RATIO, // 攻击速度 - 百分比型 + [Attrs.REFLICT]: BType.RATIO, // 反伤比率 - 百分比型 + [Attrs.LIFESTEAL]: BType.RATIO, // 吸血比率 - 百分比型 + [Attrs.KNOCKBACK]: BType.RATIO, // 击退概率 - 百分比型 + [Attrs.CON_RES]: BType.RATIO, // 控制抗性 - 百分比型 + [Attrs.ICE_RES]: BType.RATIO, // 冰冻抗性 - 百分比型 + [Attrs.FIRE_RES]: BType.RATIO, // 火抗性 - 百分比型 + [Attrs.WIND_RES]: BType.RATIO, // 风抗性 - 百分比型 + [Attrs.ICE_POWER]: BType.RATIO, // 冰冻伤害效果提升 - 百分比型 + [Attrs.FIRE_POWER]: BType.RATIO, // 火伤害效果提升 - 百分比型 + [Attrs.WIND_POWER]: BType.RATIO, // 风伤害效果提升 - 百分比型 + [Attrs.SHIELD_UP]: BType.RATIO, // 护盾效果提升 - 百分比型 + [Attrs.BUFF_UP]: BType.RATIO, // buff效果提升 - 百分比型 + [Attrs.DBUFF_UP]: BType.RATIO, // debuff效果提升 - 百分比型 + [Attrs.SPEED]: BType.RATIO, // 移动速度加成 - 百分比型 +}; + +/** + * 判断属性是否为百分比型 + * @param attrType 属性类型 + * @returns true: 百分比型, false: 数值型 + */ +export const isRatioAttr = (attrType: Attrs): boolean => { + return AttrsType[attrType] === BType.RATIO; +}; + +/** + * 获取属性的类型 + * @param attrType 属性类型 + * @returns BType.VALUE 或 BType.RATIO + */ +export const getAttrType = (attrType: Attrs): BType => { + return AttrsType[attrType]; +}; + /** * 获取 debuff 对应的属性字段 * @param debuffType DBuff 类型 @@ -214,14 +283,6 @@ export const getAttrFieldFromDebuff = (debuffType: DBuff): number => { return attrField; }; - - -export enum BType { - VALUE=0, //数值型 - RATIO=1 //百分比型 -} - - /* === 技能配置系统使用说明 === diff --git a/assets/script/game/common/ecs/position/BattleMoveSystem.ts b/assets/script/game/common/ecs/position/BattleMoveSystem.ts index 6d48e87c..837cd415 100644 --- a/assets/script/game/common/ecs/position/BattleMoveSystem.ts +++ b/assets/script/game/common/ecs/position/BattleMoveSystem.ts @@ -29,9 +29,7 @@ export class BattleMoveSystem extends ecs.ComblockSystem implements ecs.ISystemU if (!shouldStop) { //在攻击范围内停止移动 // if(view.fac==1){ - const isStun = view.V_DBUFF.some(d => d.debuff === DBuff.STUN); - const isFrost = view.V_DBUFF.some(d => d.debuff === DBuff.FROST); - if(view.is_stop||view.is_dead||isStun||isFrost) { + if(view.is_stop||view.is_dead||view.isStun()||view.isFrost()) { view.status_change("idle"); return; //停止移动或者死亡不移动 } diff --git a/assets/script/game/hero/HeroViewComp.ts b/assets/script/game/hero/HeroViewComp.ts index 79ff4016..2287570f 100644 --- a/assets/script/game/hero/HeroViewComp.ts +++ b/assets/script/game/hero/HeroViewComp.ts @@ -18,10 +18,10 @@ const { ccclass, property } = _decorator; * ==================== BUFF 系统使用说明 ==================== * * 1. 系统架构: - * - V_BUFF/V_BUFFS: 数值型 buff(持久/临时) - * - R_BUFF/R_BUFFS: 百分比型 buff(持久/临时) - * - V_DBUFF/V_DBUFFS: 数值型 debuff(持久/临时) - * - R_DBUFF/R_DBUFFS: 百分比型 debuff(持久/临时) + * - BUFF_V/BUFFS_V: 数值型 buff(持久/临时) + * - BUFF_R/BUFFS_R: 百分比型 buff(持久/临时) + * - DBUFF_V/DBUFFS_V: 数值型 debuff(持久/临时) + * - DBUFF_R/DBUFFS_R: 百分比型 debuff(持久/临时) * * 2. 初始化(在英雄加载时自动调用): * - initBuffsDebuffs(): 从 HeroInfo 读取初始配置 @@ -108,17 +108,15 @@ export class HeroViewComp extends CCComp { Attrs:any=[] //数值型debuff - V_DBUFF:any[]=[] //持久 - V_DBUFFS:any[]=[] //临时 带时间 - //百分比型debuff - R_DBUFF:any[]=[] //持久 - R_DBUFFS:any[]=[] //临时 带时间 - //数值型buff - V_BUFF:any[]=[] //持久 - V_BUFFS:any[]=[] //临时 带时间 - //百分比型buff - R_BUFF:any[]=[] //持久 - R_BUFFS:any[]=[] //临时 带时间 + DBUFF_V:any[]=[] //持久 + DBUFF_R:any[]=[] //持久 + BUFF_V:any[]=[] //持久 + BUFF_R:any[]=[] //持久 + + DBUFFS_V:any[]=[] //临时 带时间 + DBUFFS_R:any[]=[] //临时 带时间 + BUFFS_V:any[]=[] //临时 带时间 + BUFFS_R:any[]=[] //临时 带时间 atk_count: number = 0; atked_count: number = 0; @@ -173,14 +171,14 @@ export class HeroViewComp extends CCComp { if (!heroInfo) return; // 清空现有 buff/debuff - this.V_BUFF = []; - this.V_BUFFS = []; - this.R_BUFF = []; - this.R_BUFFS = []; - this.V_DBUFF = []; - this.V_DBUFFS = []; - this.R_DBUFF = []; - this.R_DBUFFS = []; + this.BUFF_V = []; + this.BUFFS_V = []; + this.BUFF_R = []; + this.BUFFS_R = []; + this.DBUFF_V = []; + this.DBUFFS_V = []; + this.DBUFF_R = []; + this.DBUFFS_R = []; // 加载初始 buff if (heroInfo.buff && heroInfo.buff.length > 0) { @@ -211,10 +209,10 @@ export class HeroViewComp extends CCComp { // 数值型 buff if (buffConf.buC === 0) { // 持久型 - this.V_BUFF.push({...buffConf}); + this.BUFF_V.push({...buffConf}); } else { // 临时型 - 添加剩余时间属性 - this.V_BUFFS.push({ + this.BUFFS_V.push({ ...buffConf, remainTime: buffConf.buC }); @@ -223,10 +221,10 @@ export class HeroViewComp extends CCComp { // 百分比型 buff if (buffConf.buC === 0) { // 持久型 - this.R_BUFF.push({...buffConf}); + this.BUFF_R.push({...buffConf}); } else { // 临时型 - 添加剩余时间属性 - this.R_BUFFS.push({ + this.BUFFS_R.push({ ...buffConf, remainTime: buffConf.buC }); @@ -256,13 +254,13 @@ export class HeroViewComp extends CCComp { // 数值型 debuff if (dbuffConf.deC === 0) { // 持久型 - this.V_DBUFF.push({ + this.DBUFF_V.push({ ...dbuffConf, attrField: attrField }); } else { // 临时型 - 添加剩余时间属性 - this.V_DBUFFS.push({ + this.DBUFFS_V.push({ ...dbuffConf, attrField: attrField, remainTime: dbuffConf.deC @@ -272,13 +270,13 @@ export class HeroViewComp extends CCComp { // 百分比型 debuff if (dbuffConf.deC === 0) { // 持久型 - this.R_DBUFF.push({ + this.DBUFF_R.push({ ...dbuffConf, attrField: attrField }); } else { // 临时型 - 添加剩余时间属性 - this.R_DBUFFS.push({ + this.DBUFFS_R.push({ ...dbuffConf, attrField: attrField, remainTime: dbuffConf.deC @@ -336,14 +334,14 @@ export class HeroViewComp extends CCComp { */ private applyValueBuffs() { // 持久型 buff - for (const buff of this.V_BUFF) { + for (const buff of this.BUFF_V) { if (buff.buff !== undefined) { this.Attrs[buff.buff] += buff.buV; } } // 临时型 buff - for (const buff of this.V_BUFFS) { + for (const buff of this.BUFFS_V) { if (buff.buff !== undefined) { this.Attrs[buff.buff] += buff.buV; } @@ -365,7 +363,7 @@ export class HeroViewComp extends CCComp { baseValues[Attrs.SPEED] = this.base_speed; // 持久型 buff - for (const buff of this.R_BUFF) { + for (const buff of this.BUFF_R) { if (buff.buff !== undefined) { const baseVal = baseValues[buff.buff] || this.Attrs[buff.buff]; this.Attrs[buff.buff] += Math.floor(baseVal * (buff.buV / 100)); @@ -373,7 +371,7 @@ export class HeroViewComp extends CCComp { } // 临时型 buff - for (const buff of this.R_BUFFS) { + for (const buff of this.BUFFS_R) { if (buff.buff !== undefined) { const baseVal = baseValues[buff.buff] || this.Attrs[buff.buff]; this.Attrs[buff.buff] += Math.floor(baseVal * (buff.buV / 100)); @@ -386,7 +384,7 @@ export class HeroViewComp extends CCComp { */ private applyValueDebuffs() { // 持久型 debuff - for (const debuff of this.V_DBUFF) { + for (const debuff of this.DBUFF_V) { // 跳过状态类 debuff(attrField === -1) if (debuff.attrField !== undefined && debuff.attrField >= 0) { this.Attrs[debuff.attrField] -= debuff.deV; @@ -394,7 +392,7 @@ export class HeroViewComp extends CCComp { } // 临时型 debuff - for (const debuff of this.V_DBUFFS) { + for (const debuff of this.DBUFFS_V) { // 跳过状态类 debuff(attrField === -1) if (debuff.attrField !== undefined && debuff.attrField >= 0) { this.Attrs[debuff.attrField] -= debuff.deV; @@ -417,7 +415,7 @@ export class HeroViewComp extends CCComp { this.Attrs[Attrs.SPEED] = this.base_speed; // 持久型 debuff - for (const debuff of this.R_DBUFF) { + for (const debuff of this.DBUFF_R) { // 跳过状态类 debuff(attrField === -1) if (debuff.attrField !== undefined && debuff.attrField >= 0) { const baseVal = baseValues[debuff.attrField] || this.Attrs[debuff.attrField]; @@ -426,7 +424,7 @@ export class HeroViewComp extends CCComp { } // 临时型 debuff - for (const debuff of this.R_DBUFFS) { + for (const debuff of this.DBUFFS_R) { // 跳过状态类 debuff(attrField === -1) if (debuff.attrField !== undefined && debuff.attrField >= 0) { const baseVal = baseValues[debuff.attrField] || this.Attrs[debuff.attrField]; @@ -465,37 +463,37 @@ export class HeroViewComp extends CCComp { let needRecalculate = false; // 更新临时型数值 buff - for (let i = this.V_BUFFS.length - 1; i >= 0; i--) { - this.V_BUFFS[i].remainTime -= dt; - if (this.V_BUFFS[i].remainTime <= 0) { - this.V_BUFFS.splice(i, 1); + for (let i = this.BUFFS_V.length - 1; i >= 0; i--) { + this.BUFFS_V[i].remainTime -= dt; + if (this.BUFFS_V[i].remainTime <= 0) { + this.BUFFS_V.splice(i, 1); needRecalculate = true; } } // 更新临时型百分比 buff - for (let i = this.R_BUFFS.length - 1; i >= 0; i--) { - this.R_BUFFS[i].remainTime -= dt; - if (this.R_BUFFS[i].remainTime <= 0) { - this.R_BUFFS.splice(i, 1); + for (let i = this.BUFFS_R.length - 1; i >= 0; i--) { + this.BUFFS_R[i].remainTime -= dt; + if (this.BUFFS_R[i].remainTime <= 0) { + this.BUFFS_R.splice(i, 1); needRecalculate = true; } } // 更新临时型数值 debuff - for (let i = this.V_DBUFFS.length - 1; i >= 0; i--) { - this.V_DBUFFS[i].remainTime -= dt; - if (this.V_DBUFFS[i].remainTime <= 0) { - this.V_DBUFFS.splice(i, 1); + for (let i = this.DBUFFS_V.length - 1; i >= 0; i--) { + this.DBUFFS_V[i].remainTime -= dt; + if (this.DBUFFS_V[i].remainTime <= 0) { + this.DBUFFS_V.splice(i, 1); needRecalculate = true; } } // 更新临时型百分比 debuff - for (let i = this.R_DBUFFS.length - 1; i >= 0; i--) { - this.R_DBUFFS[i].remainTime -= dt; - if (this.R_DBUFFS[i].remainTime <= 0) { - this.R_DBUFFS.splice(i, 1); + for (let i = this.DBUFFS_R.length - 1; i >= 0; i--) { + this.DBUFFS_R[i].remainTime -= dt; + if (this.DBUFFS_R[i].remainTime <= 0) { + this.DBUFFS_R.splice(i, 1); needRecalculate = true; } } @@ -506,6 +504,12 @@ export class HeroViewComp extends CCComp { } } + public isStun() { + return this.DBUFF_V.some(d => d.debuff === DBuff.STUN) + } + public isFrost() { + return this.DBUFF_V.some(d => d.debuff === DBuff.FROST) + } update(dt: number){ if(!smc.mission.play||smc.mission.pause) return diff --git a/assets/script/game/skills/SkillCom.ts b/assets/script/game/skills/SkillCom.ts index e115243a..ccab7427 100644 --- a/assets/script/game/skills/SkillCom.ts +++ b/assets/script/game/skills/SkillCom.ts @@ -3,7 +3,7 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { smc } from "../common/SingletonModuleComp"; import { GameEvent } from "../common/config/GameEvent"; -import { AType, BuffAttr, DTType, EType, SkillSet, SType, TGroup } from "../common/config/SkillSet"; +import { AType, DTType, EType, SkillSet, SType, TGroup } from "../common/config/SkillSet"; import { BoxSet, FacSet } from "../common/config/BoxSet"; import { HeroViewComp } from "../hero/HeroViewComp"; import { BezierMove } from "../BezierMove/BezierMove";