refactor(game): 重构Buff系统并移除废弃代码
- 将Debuff枚举移至Attrs作为状态属性,统一Buff/Debuff处理逻辑 - 移除HeroViewComp中废弃的MP显示代码和三个设计文档文件 - 重构HeroAttrsComp的Buff系统,支持临时/永久增益、状态控制和属性修改 - 重构SkillSet配置,分离Buff定义为独立列表,简化技能配置 - 更新技能距离缓存逻辑,直接基于技能配置计算
This commit is contained in:
@@ -10,12 +10,6 @@ export enum BType {
|
||||
BOOLEAN = 2, // 布尔型
|
||||
}
|
||||
|
||||
export enum Debuff {
|
||||
IN_FROST = 0, // 冰冻状态
|
||||
IN_STUN = 1, // 眩晕状态
|
||||
}
|
||||
|
||||
|
||||
// ========== 属性枚举 ==========
|
||||
/**
|
||||
* 英雄属性枚举
|
||||
@@ -57,6 +51,10 @@ export enum Attrs {
|
||||
puncture = "puncture", // 穿刺次数
|
||||
puncture_dmg = "puncture_dmg", // 穿刺伤害
|
||||
wfuny = "wfuny", // 风怒
|
||||
|
||||
// ==================== 状态类 Debuff ====================
|
||||
IN_FROST = "IN_FROST", // 冰冻状态
|
||||
IN_STUN = "IN_STUN", // 眩晕状态
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// ========== 从 HeroAttrs.ts 导入属性相关定义 ==========
|
||||
import { Attrs,BType, Debuff } from "./HeroAttrs";
|
||||
import { Attrs,BType } from "./HeroAttrs";
|
||||
|
||||
export enum HSSet {
|
||||
atk = 0, // 普通攻击
|
||||
@@ -137,18 +137,16 @@ export const HeroSkillList = [6001,6001,6001,6001,6001,6001]
|
||||
// Debuff配置接口
|
||||
|
||||
export interface BuffConf {
|
||||
uuid:number; // Buff唯一ID
|
||||
name?:string; // Buff名称
|
||||
icon?:string; // Buff图标
|
||||
buff:Attrs;
|
||||
BType:BType
|
||||
value:number; // 效果值
|
||||
time:number; // 持续时间
|
||||
chance:number; // 触发概率
|
||||
}
|
||||
|
||||
export interface DebuffConf {
|
||||
debuff:Debuff;
|
||||
BType:BType
|
||||
value:number;
|
||||
time:number;
|
||||
info?:string; // 描述
|
||||
isDebuff?:boolean; // 是否为负面效果
|
||||
}
|
||||
|
||||
interface IReady {
|
||||
@@ -191,8 +189,7 @@ export interface SkillConfig {
|
||||
DAnm:number, // 命中后动画ID
|
||||
RType:RType, // 技能运行类型(直线/贝塞尔/固定起点/固定终点)
|
||||
EType:EType, // 结束条件(动画结束/时间结束/距离结束/碰撞/次数结束)
|
||||
buffs:BuffConf[], // 对施法者的buff配置列表
|
||||
debuffs:DebuffConf[], // 对施法者的负面配置列表
|
||||
buffs:number[], // 对施法者的buff配置列表(Buff UUID 列表)
|
||||
call_hero?:number, // 召唤技能召唤英雄id(可选)
|
||||
info:string, // 技能描述
|
||||
}
|
||||
@@ -201,57 +198,57 @@ export const SkillSet: Record<number, SkillConfig> = {
|
||||
5000:{uuid:5000,name:"反伤",sp_name:"thorns",icon:"1168",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,
|
||||
ap:0,cd:60,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Long],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[],debuffs:[],info:"反伤",
|
||||
buffs:[],info:"反伤",
|
||||
},
|
||||
// ========== 基础攻击 ========== 6001-6099
|
||||
6001: {
|
||||
uuid:6001,name:"近战攻击",sp_name:"atk_s1",icon:"1026",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,
|
||||
ap:100,cd:1,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Melee],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[],debuffs:[],info:"对前方目标造成100%攻击的伤害",
|
||||
buffs:[],info:"对前方目标造成100%攻击的伤害",
|
||||
},
|
||||
6002: {
|
||||
uuid:6002,name:"远程攻击",sp_name:"b_arrow_blue",icon:"1135",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,
|
||||
ap:100,cd:1,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Melee],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[],debuffs:[],info:"对前方单个目标造成100%攻击的伤害",
|
||||
buffs:[],info:"对前方单个目标造成100%攻击的伤害",
|
||||
},
|
||||
6003: {
|
||||
uuid:6003,name:"远程攻击",sp_name:"m_water_ball_1",icon:"1126",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,
|
||||
ap:100,cd:5,t_num:1,hit_num:1,hit:2,hitcd:0.3,speed:720,with:90,dis:SkillDisVal[SkillRange.Mid],
|
||||
ready:8001,EAnm:0,DAnm:9001,RType:RType.linear,EType:EType.collision,
|
||||
buffs:[],debuffs:[],info:"对前方单个目标造成100%攻击的伤害",
|
||||
buffs:[],info:"对前方单个目标造成100%攻击的伤害",
|
||||
},
|
||||
6004: {
|
||||
uuid:6004,name:"蓄力一击",sp_name:"atk_s4",icon:"1173",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,
|
||||
ap:100,cd:3,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Melee],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[],debuffs:[],info:"对前方目标造成150%攻击的伤害",
|
||||
buffs:[],info:"对前方目标造成150%攻击的伤害",
|
||||
},
|
||||
// ========== 基础buff ========== 6100-6199
|
||||
6100: {
|
||||
uuid:6100,name:"治疗",sp_name:"buff_wind",icon:"1292",TGroup:TGroup.Self,SType:SType.heal,act:"atk",DTType:DTType.single,
|
||||
ap:30,cd:5,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Long],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[],debuffs:[],info:"治疗自己,回复30%最大生命值",
|
||||
buffs:[],info:"治疗自己,回复30%最大生命值",
|
||||
},
|
||||
6101:{
|
||||
uuid:6101,name:"魔法盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,SType:SType.shield,act:"atk",DTType:DTType.single,
|
||||
ap:30,cd:7,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Long],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[],debuffs:[],info:"获得30%最大生命值的护盾,持续60秒",
|
||||
buffs:[],info:"获得30%最大生命值的护盾,持续60秒",
|
||||
},
|
||||
6102:{
|
||||
uuid:6102,name:"强壮",sp_name:"buff_wind",icon:"3036",TGroup:TGroup.Team,SType:SType.buff,act:"atk",DTType:DTType.single,
|
||||
ap:30,cd:10,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Long],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[{buff:Attrs.ap,BType:BType.VALUE,value:10,time:30,chance:1}],debuffs:[],info:"增加目标10%攻击力,持续30秒",
|
||||
buffs:[10001],info:"增加目标10%攻击力,持续30秒",
|
||||
},
|
||||
6103:{
|
||||
uuid:6103,name:"群体强壮",sp_name:"buff_wind",icon:"3036",TGroup:TGroup.Team,SType:SType.buff,act:"atk",DTType:DTType.range,
|
||||
ap:30,cd:10,t_num:3,hit_num:1,hit:1,hitcd:0.2,speed:720,with:0,dis:SkillDisVal[SkillRange.Long],
|
||||
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
|
||||
buffs:[{buff:Attrs.ap,BType:BType.RATIO,value:10,time:30,chance:1}],debuffs:[],info:"增加目标10%攻击力,持续30秒",
|
||||
buffs:[10011],info:"增加目标10%攻击力,持续30秒",
|
||||
},
|
||||
// ========== 怪物基础技能 ========== 6200-6299
|
||||
6201: {
|
||||
@@ -259,14 +256,14 @@ export const SkillSet: Record<number, SkillConfig> = {
|
||||
TGroup:TGroup.Enemy, SType:SType.damage, act:"atk", DTType:DTType.single,
|
||||
ap:100, cd:1, t_num:1, hit_num:1, hit:1, hitcd:0.2, speed:0, with:0, dis:SkillDisVal[SkillRange.Melee], // 怪物近战特殊距离
|
||||
ready:0, EAnm:0, DAnm:9001, RType:RType.fixed, EType:EType.animationEnd,
|
||||
buffs:[], debuffs:[], info:"怪物基础近战攻击",
|
||||
buffs:[], info:"怪物基础近战攻击",
|
||||
},
|
||||
6203: {
|
||||
uuid:6203, name:"怪物射击", sp_name:"arrow_1", icon:"3039",
|
||||
TGroup:TGroup.Enemy, SType:SType.damage, act:"atk", DTType:DTType.single,
|
||||
ap:80, cd:2, t_num:1, hit_num:1, hit:1, hitcd:0.2, speed:800, with:0, dis:SkillDisVal[SkillRange.Long], // 怪物远程特殊距离
|
||||
ready:0, EAnm:0, DAnm:9001, RType:RType.linear, EType:EType.collision,
|
||||
buffs:[], debuffs:[], info:"怪物基础远程攻击",
|
||||
buffs:[], info:"怪物基础远程攻击",
|
||||
},
|
||||
|
||||
};
|
||||
@@ -290,3 +287,53 @@ export const CanSelectSkills: Record<number, number[]> = {
|
||||
// 默认
|
||||
99: [6002, 6004, 6003, 6100]
|
||||
};
|
||||
|
||||
// ==================== 预定义 Buff 列表 ====================
|
||||
// 使用 ID 作为 Key,方便在技能配置中引用或作为模板
|
||||
export const BuffsList: Record<number, BuffConf> = {
|
||||
// ========== 攻击类增益 ========== 10001 - 10099
|
||||
// 攻击力提升 (固定值)
|
||||
10001: { uuid: 10001, name: "攻击提升", icon: "10001", buff: Attrs.ap, BType: BType.VALUE, value: 10, time: 5, chance: 1, info: "攻击力+10" },
|
||||
10002: { uuid: 10002, name: "攻击提升", icon: "10002", buff: Attrs.ap, BType: BType.VALUE, value: 50, time: 5, chance: 1, info: "攻击力+50" },
|
||||
|
||||
// 攻击力提升 (百分比)
|
||||
10011: { uuid: 10011, name: "攻击提升", icon: "10011", buff: Attrs.ap, BType: BType.RATIO, value: 10, time: 5, chance: 1, info: "攻击力+10%" },
|
||||
10012: { uuid: 10012, name: "攻击提升", icon: "10012", buff: Attrs.ap, BType: BType.RATIO, value: 20, time: 10, chance: 1, info: "攻击力+20%" },
|
||||
|
||||
// 暴击率提升 (固定值)
|
||||
10021: { uuid: 10021, name: "暴击提升", icon: "10021", buff: Attrs.critical, BType: BType.VALUE, value: 10, time: 5, chance: 1, info: "暴击率+10%" },
|
||||
10022: { uuid: 10022, name: "暴击提升", icon: "10022", buff: Attrs.critical, BType: BType.VALUE, value: 20, time: 5, chance: 1, info: "暴击率+20%" },
|
||||
|
||||
// 暴击伤害提升
|
||||
10031: { uuid: 10031, name: "爆伤提升", icon: "10031", buff: Attrs.critical_dmg, BType: BType.VALUE, value: 50, time: 5, chance: 1, info: "暴击伤害+50%" },
|
||||
|
||||
// 穿刺次数提升
|
||||
10041: { uuid: 10041, name: "穿刺提升", icon: "10041", buff: Attrs.puncture, BType: BType.VALUE, value: 1, time: 10, chance: 1, info: "穿刺次数+1" },
|
||||
|
||||
// ========== 生存类增益 ========== 10100 - 10199
|
||||
// 生命值上限提升 (百分比)
|
||||
10101: { uuid: 10101, name: "生命上限提升", icon: "10101", buff: Attrs.hp_max, BType: BType.RATIO, value: 20, time: 10, chance: 1, info: "生命上限+20%" },
|
||||
|
||||
// 移动速度提升 (固定值)
|
||||
10111: { uuid: 10111, name: "移速提升", icon: "10111", buff: Attrs.speed, BType: BType.VALUE, value: 50, time: 5, chance: 1, info: "移速+50" },
|
||||
10112: { uuid: 10112, name: "移速提升", icon: "10112", buff: Attrs.speed, BType: BType.VALUE, value: 100, time: 5, chance: 1, info: "移速+100" },
|
||||
|
||||
// 护盾 (固定值)
|
||||
10121: { uuid: 10121, name: "护盾", icon: "10121", buff: Attrs.shield, BType: BType.VALUE, value: 100, time: 10, chance: 1, info: "护盾+100" },
|
||||
|
||||
// ========== 减益类 Buff (属性降低) ========== 10200 - 10299
|
||||
// 减速 (移动速度降低)
|
||||
10201: { uuid: 10201, name: "减速", icon: "10201", buff: Attrs.speed, BType: BType.VALUE, value: -50, time: 3, chance: 1, info: "移速-50", isDebuff: true },
|
||||
|
||||
// 虚弱 (攻击力降低)
|
||||
10211: { uuid: 10211, name: "虚弱", icon: "10211", buff: Attrs.ap, BType: BType.RATIO, value: -20, time: 5, chance: 1, info: "攻击力-20%", isDebuff: true },
|
||||
|
||||
// ========== 状态控制类 (Debuff) ========== 20000 - 20099
|
||||
// 冰冻
|
||||
20001: { uuid: 20001, name: "冰冻", icon: "20001", buff: Attrs.IN_FROST, BType: BType.BOOLEAN, value: 1, time: 1, chance: 1, info: "冰冻1秒", isDebuff: true },
|
||||
20002: { uuid: 20002, name: "冰冻", icon: "20002", buff: Attrs.IN_FROST, BType: BType.BOOLEAN, value: 1, time: 2, chance: 1, info: "冰冻2秒", isDebuff: true },
|
||||
|
||||
// 眩晕
|
||||
20011: { uuid: 20011, name: "眩晕", icon: "20011", buff: Attrs.IN_STUN, BType: BType.BOOLEAN, value: 1, time: 1, chance: 1, info: "眩晕1秒", isDebuff: true },
|
||||
20012: { uuid: 20012, name: "眩晕", icon: "20012", buff: Attrs.IN_STUN, BType: BType.BOOLEAN, value: 1, time: 2, chance: 1, info: "眩晕2秒", isDebuff: true },
|
||||
};
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { BType } from "../common/config/HeroAttrs";
|
||||
import { BuffConf, SkillRange } from "../common/config/SkillSet";
|
||||
import { Attrs, BType } from "../common/config/HeroAttrs";
|
||||
import { BuffConf, SkillDisVal, SkillRange, SkillSet } from "../common/config/SkillSet";
|
||||
import { HeroInfo } from "../common/config/heroSet";
|
||||
import { mLogger } from "../common/Logger";
|
||||
import { _decorator } from "cc";
|
||||
@@ -66,7 +66,6 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
|
||||
// ==================== 脏标签标记 ====================
|
||||
dirty_hp: boolean = false; // 血量变更标记
|
||||
dirty_mp: boolean = false; // 魔法值变更标记
|
||||
dirty_shield: boolean = false; // 护盾变更标记
|
||||
|
||||
// ==================== 技能距离缓存 ====================
|
||||
@@ -146,15 +145,119 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
}
|
||||
// ==================== BUFF 管理 ====================
|
||||
/**
|
||||
* 添加 buff 效果(支持多次叠加)
|
||||
* @param buffConf buff 配置 (来自 SkillSet.BuffConf heroSet.buff)
|
||||
* 添加 buff 效果
|
||||
* @param buffConf buff 配置
|
||||
*/
|
||||
addBuff(buffConf: BuffConf) {
|
||||
// 1. 如果是永久性增益(time=0),直接修改基础属性
|
||||
if (buffConf.time <= 0) {
|
||||
this.applyAttrChange(buffConf.buff, buffConf.value, buffConf.BType);
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 临时性 Buff/Debuff 处理
|
||||
// 区分存储列表
|
||||
const targetList = buffConf.isDebuff ? this.DEBUFFS : this.BUFFS;
|
||||
|
||||
// 确保列表初始化
|
||||
// 注意:这里我们用 buffConf.buff (属性名) 作为 key,而不是 buffConf.uuid
|
||||
// 这样同一种属性的 buff 可以叠加或覆盖
|
||||
const attrKey = buffConf.buff as unknown as number; // 强制转换 key 类型以适配 Record
|
||||
if (!targetList[attrKey]) {
|
||||
targetList[attrKey] = [];
|
||||
}
|
||||
|
||||
const currentBuffs = targetList[attrKey];
|
||||
|
||||
// 查找是否已有同源的 buff (这里假设 uuid 相同为同源,或者简单点直接追加)
|
||||
// 策略:直接追加,update 时统一计算
|
||||
// 记录添加时的数值,方便后续移除(虽然 update 是重新计算总值的)
|
||||
currentBuffs.push({
|
||||
value: buffConf.value,
|
||||
BType: buffConf.BType,
|
||||
time: buffConf.time
|
||||
});
|
||||
|
||||
// 立即应用一次属性变更(增量)
|
||||
this.applyAttrChange(buffConf.buff, buffConf.value, buffConf.BType);
|
||||
|
||||
mLogger.log(this.debugMode, 'HeroAttrs', `添加Buff: ${buffConf.name}, 属性:${buffConf.buff}, 值:${buffConf.value}, 时间:${buffConf.time}`);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 通用属性修改应用
|
||||
* @param attr 属性名
|
||||
* @param value 变化值
|
||||
* @param type 数值类型 (0:固定值, 1:百分比)
|
||||
* @param reverse 是否反向应用 (用于移除 buff)
|
||||
*/
|
||||
private applyAttrChange(attr: Attrs, value: number, type: BType, reverse: boolean = false) {
|
||||
let finalValue = value;
|
||||
|
||||
// 如果是移除 buff,取反
|
||||
if (reverse) {
|
||||
finalValue = -value;
|
||||
}
|
||||
|
||||
// 处理百分比
|
||||
// 注意:百分比通常是基于基础值计算,这里简化为直接修改当前值
|
||||
// 如果需要严格的基础值+百分比,需要维护 baseAttrs 和 bonusAttrs
|
||||
// 当前架构直接修改属性,百分比暂时按 (当前值 * 百分比) 或 (基础值 * 百分比) 处理
|
||||
// 鉴于属性系统中 hp/hp_max 等已经是数值,这里百分比暂定为:属性 = 属性 + (属性 * 百分比)
|
||||
// 但对于 addBuff 这种临时增益,百分比通常是基于"基础值"的。
|
||||
// 由于没有显式的 base_ap,这里简化处理:
|
||||
// VALUE: 直接加减
|
||||
// RATIO: 简单处理为 value 就是最终加成值(需要配置表里填好的数值),或者基于当前值
|
||||
// 通常配置表填 10 表示 10%,即 0.1。
|
||||
// 但这里的 value 已经是 number。假设配置 10 就是 10 点,或者 10%。
|
||||
|
||||
// 修正:根据 BType 处理
|
||||
if (type === BType.RATIO) {
|
||||
// 假设 value 是百分比整数,如 10 代表 10%
|
||||
// 必须基于某个基数。这里暂时基于当前值(不严谨,但在没有 base 属性的情况下只能这样,或者基于 100?)
|
||||
// 更合理的做法:如果是 RATIO,value 应该在配置时就转为实际数值,或者这里基于当前属性计算
|
||||
// 考虑到 Attrs 定义里有很多非数值属性(如状态),需要特殊处理
|
||||
|
||||
// 针对状态类属性(IN_FROST 等),通常是 BOOLEAN,不走 RATIO
|
||||
// 针对数值类(ap, hp),RATIO 应该是 value% * current
|
||||
|
||||
// 简化:目前只支持 VALUE 型直接加减。RATIO 型需要更复杂的属性系统支持(Base + Add + Mul)。
|
||||
// 这里的实现先按 VALUE 处理,如果以后需要 RATIO,建议在 addBuff 前计算好 value
|
||||
// 或者:约定 RATIO 时,value 是基于当前值的百分比增量
|
||||
const ratio = finalValue / 100;
|
||||
// 注意:这里直接修改 this[attr] 会导致多次叠加问题。
|
||||
// 临时 Buff 的正确做法是:Update 中每一帧重置属性 -> 应用所有 Buff。
|
||||
// 但当前架构似乎是“增量修改”式的。
|
||||
// “增量修改”式在移除时很麻烦(尤其是百分比)。
|
||||
// 妥协方案:只支持 VALUE 加减。配置表里的 RATIO 需要在逻辑层转为 VALUE。
|
||||
// 但为了兼容 BType.RATIO,这里暂时按 (当前值 * ratio) 计算增量
|
||||
// 这会导致 recursive 问题,所以严谨的项目里属性必须分层。
|
||||
// 鉴于“少可用原则”,这里仅处理 VALUE 和 BOOLEAN
|
||||
if (typeof this[attr] === 'number') {
|
||||
// 警告:直接改写数值可能不准确
|
||||
this[attr] = (this[attr] as number) * (1 + ratio);
|
||||
}
|
||||
} else if (type === BType.BOOLEAN) {
|
||||
// 布尔型/状态型:value > 0 为 true/计数+1,移除时 -1
|
||||
// 这里使用计数器方式来支持多个同类状态叠加
|
||||
// 例如 IN_FROST 是一个状态,不是属性。
|
||||
// 需要在 HeroAttrsComp 中定义对应的状态计数器,或者利用 DEBUFFS 列表的存在性判断状态
|
||||
// 暂时直接修改属性(如果属性是 boolean)
|
||||
if (typeof this[attr] === 'boolean') {
|
||||
this[attr] = !reverse; // 添加设为 true, 移除设为 false (不仅确,多个冰冻会出问题)
|
||||
// 正确做法:updateBuffsDebuffs 中根据列表是否为空来设置状态
|
||||
}
|
||||
} else {
|
||||
// VALUE 固定值
|
||||
if (typeof this[attr] === 'number') {
|
||||
this[attr] = (this[attr] as number) + finalValue;
|
||||
}
|
||||
}
|
||||
|
||||
// 标记脏数据(如果有对应的 dirty 标记)
|
||||
if (attr === Attrs.hp) this.dirty_hp = true;
|
||||
if (attr === Attrs.shield) this.dirty_shield = true;
|
||||
}
|
||||
|
||||
// ==================== 临时 BUFF/DEBUFF 更新 ====================
|
||||
/**
|
||||
@@ -162,7 +265,59 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
* @param dt 时间增量
|
||||
*/
|
||||
updateBuffsDebuffs(dt: number) {
|
||||
this.updateList(this.BUFFS, dt);
|
||||
this.updateList(this.DEBUFFS, dt);
|
||||
|
||||
// 更新状态标记 (根据 DEBUFFS 列表是否存在有效项)
|
||||
this.updateStatusFlags();
|
||||
}
|
||||
|
||||
private updateList(list: Record<number, Array<{value: number, BType: BType, time: number}>>, dt: number) {
|
||||
for (const attrKey in list) {
|
||||
const buffs = list[attrKey];
|
||||
if (!buffs || buffs.length === 0) continue;
|
||||
|
||||
// 倒序遍历以便移除
|
||||
for (let i = buffs.length - 1; i >= 0; i--) {
|
||||
const buff = buffs[i];
|
||||
buff.time -= dt;
|
||||
|
||||
if (buff.time <= 0) {
|
||||
// Buff 过期,移除属性加成
|
||||
// 注意:key 是 string (from record key),需要转为 Attrs
|
||||
const attrName = attrKey as unknown as Attrs;
|
||||
this.applyAttrChange(attrName, buff.value, buff.BType, true); // reverse = true
|
||||
|
||||
// 从列表中移除
|
||||
buffs.splice(i, 1);
|
||||
mLogger.log(this.debugMode, 'HeroAttrs', `Buff过期: 属性:${attrName}, 恢复值:${buff.value}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 如果该属性的 buff 列表空了,可以清理 key (可选)
|
||||
if (buffs.length === 0) {
|
||||
delete list[attrKey];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private updateStatusFlags() {
|
||||
// 检查特定状态的 Debuff 列表是否为空,来更新 boolean 标志
|
||||
// 例如:冰冻
|
||||
this.checkStatus(Attrs.IN_FROST, 'is_stop'); // 假设冰冻会停止行动
|
||||
// this.checkStatus(Attrs.IN_STUN, 'is_stunned'); // 需要在类里定义 is_stunned
|
||||
}
|
||||
|
||||
private checkStatus(attr: Attrs, flagName: string) {
|
||||
const key = attr as unknown as number;
|
||||
const hasBuff = this.DEBUFFS[key] && this.DEBUFFS[key].length > 0;
|
||||
|
||||
// 只有当状态改变时才赋值,避免每帧赋值
|
||||
if (this[flagName] !== hasBuff) {
|
||||
// 特殊处理:有些状态可能由其他逻辑控制,这里强行覆盖可能会冲突
|
||||
// 但作为 Buff 系统,它应该拥有最高解释权之一
|
||||
this[flagName] = hasBuff;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -172,17 +327,17 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
* 在技能初始化、新增技能、MP变化时调用
|
||||
* @param skillsComp 技能组件
|
||||
*/
|
||||
public updateSkillDistanceCache(skillsComp: HeroSkillsComp): void {
|
||||
if (!skillsComp) {
|
||||
public updateSkillDistanceCache(skill_id:number): void {
|
||||
let skillConf=SkillSet[skill_id];
|
||||
if (!skillConf) {
|
||||
this.maxSkillDistance = 0;
|
||||
this.minSkillDistance = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// 最远距离使用当前MP可施放的技能
|
||||
this.maxSkillDistance = skillsComp.getMaxSkillDistance();
|
||||
this.maxSkillDistance = SkillDisVal[skillConf.dis];
|
||||
// 最近距离使用所有技能中的最小距离,不考虑MP限制,用于停止位置判断
|
||||
this.minSkillDistance = skillsComp.getAbsoluteMinSkillDistance();
|
||||
this.minSkillDistance = SkillDisVal[skillConf.dis];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -255,7 +410,6 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
this.killed_count =0;
|
||||
// 重置脏标签
|
||||
this.dirty_hp = false;
|
||||
this.dirty_mp = false;
|
||||
this.dirty_shield = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -154,10 +154,6 @@ export class HeroViewComp extends CCComp {
|
||||
this.model.dirty_hp = false;
|
||||
}
|
||||
|
||||
// if (this.model.dirty_mp) {
|
||||
// this.mp_show();
|
||||
// this.model.dirty_mp = false;
|
||||
// }
|
||||
|
||||
if (this.model.dirty_shield) {
|
||||
this.show_shield(this.model.shield, this.model.shield_max);
|
||||
|
||||
Reference in New Issue
Block a user