Files
heros/assets/script/game/hero/BuffSystem_Guide.md
2025-10-17 00:29:34 +08:00

477 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BUFF 系统完整使用指南
## 系统概述
HeroViewComp 中的 buff 系统是一套完整的属性增强/减弱管理体系,支持:
- **数值型 buff/debuff**:固定数值增减
- **百分比型 buff/debuff**:基于基础属性的百分比增减
- **持久型**:永久生效,直到主动移除
- **临时型**:按时间递减,自动过期
## 架构设计
### 存储结构
```typescript
// 数值型 buff
V_BUFF: BuffConf[] // 持久型
V_BUFFS: BuffConf[] // 临时型(含 remainTime
// 百分比型 buff
R_BUFF: BuffConf[] // 持久型
R_BUFFS: BuffConf[] // 临时型(含 remainTime
// 数值型 debuff
V_DBUFF: DbuffConf[] // 持久型
V_DBUFFS: DbuffConf[]// 临时型(含 remainTime
// 百分比型 debuff
R_DBUFF: DbuffConf[] // 持久型
R_DBUFFS: DbuffConf[]// 临时型(含 remainTime
```
### 初始值属性
以下属性拥有初始值,百分比 buff 基于这些值计算:
- `base_hp`: 基础血量
- `base_mp`: 基础魔法值
- `base_def`: 基础防御
- `base_ap`: 基础攻击力
- `base_map`: 基础魔法攻击
其他属性CRITICAL, DODGE, AS 等)默认值为 0。
## 接口定义
### BuffConfbuff 配置)
```typescript
export interface BuffConf {
buff: Attrs; // 影响的属性
BType: BType; // VALUE(0)数值型 或 RATIO(1)百分比型
buV: number; // 增益值
buC: number; // 持续时间0=持久,>0=临时)
buR: number; // 触发概率(1-100)
}
```
### DbuffConfdebuff 配置)
```typescript
export interface DbuffConf {
debuff: DBuff; // debuff 类型
BType: BType; // VALUE(0)数值型 或 RATIO(1)百分比型
dev: number; // 减益值
deC: number; // 持续时间0=持久,>0=临时)
deR: number; // 触发概率(1-100)
}
```
## API 文档
### 1. 初始化系统
#### `initBuffsDebuffs(): void`
**作用**:从 HeroInfo 读取英雄初始配置,初始化 buff/debuff 系统
**调用时机**:英雄加载时(在 Hero.hero_init() 中自动调用)
**示例**
```typescript
// 自动调用,无需手动调用
heroView.initBuffsDebuffs();
```
---
### 2. 添加 Buff
#### `addBuff(buffConf: BuffConf): void`
**作用**:添加 buff 效果
**参数**
- `buffConf`: BuffConf 对象
**自动行为**
- 根据 BType 和 buC 自动分类存储
- 立即重新计算 Attrs
**示例**
```typescript
// 添加数值型持久 buff+10 攻击力
heroView.addBuff({
buff: Attrs.AP,
BType: BType.VALUE,
buV: 10,
buC: 0, // 0 表示持久
buR: 100
});
// 添加百分比型临时 buff+20% 防御,持续 5 秒
heroView.addBuff({
buff: Attrs.DEF,
BType: BType.RATIO,
buV: 20,
buC: 5, // 5 秒后过期
buR: 100
});
// 从技能配置添加(来自 SkillSet
const skillBuff: BuffConf = {
buff: Attrs.CRITICAL,
BType: BType.VALUE,
buV: 25, // +25% 暴击率
buC: 3, // 持续 3 秒
buR: 100
};
heroView.addBuff(skillBuff);
```
---
### 3. 添加 Debuff
#### `addDebuff(dbuffConf: DbuffConf): void`
**作用**:添加 debuff 效果
**参数**
- `dbuffConf`: DbuffConf 对象
**自动行为**
- DBuff 类型自动映射到对应 Attrs
- 根据 BType 和 deC 自动分类存储
- 立即重新计算 Attrs
**DBuff 映射表**
| DBuff 类型 | 对应 Attrs | 说明 |
|-----------|-----------|------|
| STUN | CON_RES | 眩晕 |
| SLOW | AS | 减速(攻击速度) |
| FROST | ICE_RES | 冰冻抗性 |
| BURN | DEF | 易伤(降低防御) |
| DEAS | AS | 减少 CD攻击速度 |
| DEHP | HP_MAX | 降低最大血量 |
| DEAP | AP | 降低攻击力 |
| DEMGP | MAP | 降低魔法攻击力 |
| BACK | KNOCKBACK | 击退概率 |
| CRITICAL | CRITICAL | 降低暴击率 |
| CRIT_DAMAGE | CRITICAL_DMG | 降低暴击伤害 |
| DODGE | DODGE | 降低闪避 |
**示例**
```typescript
// 眩晕:持久型,无数值影响
heroView.addDebuff({
debuff: DBuff.STUN,
BType: BType.VALUE,
dev: 0,
deC: 0, // 持久
deR: 100
});
// 减速:临时型,-30% 攻击速度,持续 3 秒
heroView.addDebuff({
debuff: DBuff.SLOW,
BType: BType.RATIO,
dev: 30, // 减少 30%
deC: 3, // 3 秒后过期
deR: 100
});
// 易伤:数值型,-5 防御,持久
heroView.addDebuff({
debuff: DBuff.BURN,
BType: BType.VALUE,
dev: 5,
deC: 0,
deR: 100
});
```
---
### 4. 移除 Buff
#### `removeBuff(buffType: Attrs, isTemporary?: boolean): boolean`
**作用**:移除指定属性的 buff
**参数**
- `buffType`: 属性类型
- `isTemporary`: 是否移除临时型(默认 false=持久型)
**返回值**:是否成功移除
**自动行为**
- 移除成功后自动重新计算 Attrs
**示例**
```typescript
// 移除持久 AP buff
heroView.removeBuff(Attrs.AP, false);
// 移除临时 DEF buff
heroView.removeBuff(Attrs.DEF, true);
```
---
### 5. 移除 Debuff
#### `removeDebuff(debuffType: DBuff, isTemporary?: boolean): boolean`
**作用**:移除指定类型的 debuff
**参数**
- `debuffType`: DBuff 类型
- `isTemporary`: 是否移除临时型
**返回值**:是否成功移除
**示例**
```typescript
// 移除持久眩晕
heroView.removeDebuff(DBuff.STUN, false);
// 移除临时减速
heroView.removeDebuff(DBuff.SLOW, true);
```
---
### 6. 属性重新计算
#### `recalculateAttrs(): void`
**作用**:重新计算所有角色属性
**调用时机**
- 自动在 addBuff/addDebuff/removeBuff/removeDebuff 时调用
- 自动在临时 buff/debuff 过期时调用
- 无需手动调用
**计算流程**
1. 重置为基础值
2. 应用数值型 buff持久 + 临时)
3. 应用百分比型 buff持久 + 临时)
4. 应用数值型 debuff持久 + 临时)
5. 应用百分比型 debuff持久 + 临时)
6. Clamp 关键属性(防止负数)
**百分比计算示例**
```
基础攻击力: 100
+20% buff: 100 * 1.2 = 120
-10% debuff: 120 * 0.9 = 108
```
---
### 7. 更新临时效果
#### `updateTemporaryBuffsDebuffs(dt: number): void`
**作用**:更新临时 buff/debuff 的剩余时间
**参数**
- `dt`: 时间增量(秒)
**调用时机**
- 自动在 update() 中每帧调用
- 无需手动调用
**自动行为**
- 减少所有临时 buff/debuff 的 remainTime
- 移除 remainTime <= 0 的效果
- 移除后自动重新计算 Attrs
---
### 8. 查询 Buff 状态
#### `getBuffValue(attrType: Attrs): number`
**作用**:获取指定属性的所有 buff 总值
**返回值**buff 总值
**示例**
```typescript
const apBuff = heroView.getBuffValue(Attrs.AP);
console.log("攻击力 buff 总和:", apBuff);
```
---
### 9. 查询 Debuff 状态
#### `getDebuffValue(debuffType: DBuff): number`
**作用**:获取指定 debuff 类型的所有 debuff 总值
**返回值**debuff 总值
**示例**
```typescript
const stunDebuff = heroView.getDebuffValue(DBuff.STUN);
console.log("眩晕等级:", stunDebuff);
```
---
### 10. 检查 Debuff 存在
#### `hasDebuff(debuffType: DBuff): boolean`
**作用**:检查是否存在指定的 debuff
**返回值**:是否存在
**示例**
```typescript
if (heroView.hasDebuff(DBuff.STUN)) {
console.log("角色已眩晕");
}
```
---
## 完整使用示例
### 场景 1技能施加 Buff
```typescript
// 在 SkillEnt.ts 或相关技能脚本中
const skillConf = SkillSet[skillId];
// 遍历技能的 buff 配置
for (const buffConf of skillConf.buffs) {
targetHero.HeroView.addBuff(buffConf);
}
// 遍历技能的 debuff 配置
for (const dbuffConf of skillConf.debuffs) {
targetHero.HeroView.addDebuff(dbuffConf);
}
```
### 场景 2英雄初始化
```typescript
// 在 Hero.ts 中(已自动调用)
hero_init(uuid: number, node: Node) {
var hv = node.getComponent(HeroViewComp)!;
let hero = HeroInfo[uuid];
// ... 其他初始化 ...
// 自动调用初始化 buff
hv.initBuffsDebuffs();
return hv;
}
```
### 场景 3属性查询
```typescript
// 获取最终计算后的属性值
const finalAP = heroView.Attrs[Attrs.AP];
const finalDEF = heroView.Attrs[Attrs.DEF];
// 获取 buff 总值
const apBuff = heroView.getBuffValue(Attrs.AP);
const defBuff = heroView.getBuffValue(Attrs.DEF);
// 检查 debuff 状态
if (heroView.hasDebuff(DBuff.STUN)) {
// 眩晕状态下无法行动
}
```
---
## 关键设计原则
### 1. 兼容式修改
- 所有方法名保持不变,易于集成
- 无痛替换原有的 buff 系统
### 2. 自动化计算
- 每次 buff 变动自动重新计算
- 无需手动更新属性
### 3. 灵活的时间管理
- 持久型buC=0永久生效
- 临时型buC>0自动按秒递减
- 过期自动移除和重新计算
### 4. 基础值保护
- 基础属性独立存储
- 百分比计算基于原始基础值
- 不会出现多次计算的偏差
### 5. 属性限制
- HP_MAX, MP_MAX 最少为 1
- 百分比属性CRITICAL, DODGE限制在 0-100
- 防止异常数值
---
## 常见问题
**Q: 如何区分持久和临时?**
A: buC=0 是持久buC>0 是临时(表示秒数)。
**Q: 百分比如何计算?**
A: 基于基础属性乘以百分比。例base_ap=100+20% → 100*1.2=120
**Q: 多个相同 buff 是否叠加?**
A: 会叠加。每个 addBuff 调用都会添加新条目。
**Q: 如何清除所有 buff**
A: 调用 initBuffsDebuffs() 重新初始化,或手动清空缓存数组。
---
## 扩展与维护
### 添加新 Buff
只需在 SkillSet.ts 的技能配置中添加即可,无需修改 HeroViewComp.ts
```typescript
buffs: [
{ buff: Attrs.AP, BType: BType.VALUE, buV: 10, buC: 0, buR: 100 }
]
```
### 添加新 Debuff
1. 在 SkillSet.ts 的 DBuff enum 中添加新类型
2. 在 HeroViewComp.ts 的 `getAttrFieldFromDebuff()` 中添加映射
3. 在技能配置中使用
详见 **BuffSystem_Extension.md** 完整扩展指南。
### 系统的扩展特性
✅ 支持无限数量的 buff/debuff
✅ 支持新增 Attrs 属性
✅ 支持新增 DBuff 类型
✅ 自动处理持久/临时管理
✅ 自动处理属性计算
✅ 编译检查确保类型安全