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

311 lines
6.9 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 系统扩展指南
## 📌 概述
本指南说明如何在项目中添加新的 buff 和 debuff 类型。系统设计支持无限扩展,无需修改核心代码。
---
## 🎯 添加新的 Buff 类型
### 步骤 1: 确定属性影响
首先明确新 buff 要影响哪个属性:
```typescript
// 示例:添加 "力量提升" buff
- 名称: PowerUp
- 属性: Attrs.AP (攻击力)
- 类型: 数值型 (BType.VALUE) 或百分比型 (BType.RATIO)
- 持续时间: 0(持久) >0(临时)
```
### 步骤 2: 在技能配置中使用
`assets/script/game/common/config/SkillSet.ts` 中的技能配置里添加:
```typescript
6001: {
uuid: 6001,
name: "攻击技能",
// ... 其他配置 ...
buffs: [
{
buff: Attrs.AP, // 影响属性
BType: BType.VALUE, // 数值型
buV: 20, // +20 攻击力
buC: 0, // 永久
buR: 100 // 100% 触发
},
{
buff: Attrs.CRITICAL, // 暴击率
BType: BType.VALUE, // 数值型
buV: 25, // +25% 暴击率
buC: 3, // 3 秒临时
buR: 100
}
],
debuffs: [],
info: "攻击技能,增加攻击力和暴击率"
}
```
### 步骤 3: 完成
✅ 系统会自动处理剩余工作:
- 自动分类存储到合适的缓存
- 自动计算属性
- 自动过期临时效果
---
## ⚡ 添加新的 Debuff 类型
### 两种 Debuff
**1. 属性型 Debuff**(直接修改属性)
-SLOW减速、BURN易伤、DEAP减攻击
- 需要对应 Attrs 属性
- 会直接修改属性值
**2. 状态型 Debuff**(只缓存不修改属性)
-STUN眩晕、FREEZE冰冻、POISON中毒
- 不需要对应 Attrs 属性
- 只缓存状态,用于战斗系统检查状态
- 查询使用:检查 debuff 缓存数组中是否存在该 debuff
---
### 添加属性型 Debuff
编辑 `assets/script/game/common/config/SkillSet.ts`
#### 步骤 1: 在 DBuff enum 中添加新类型
```typescript
export enum DBuff {
STUN = 1, // 现有
SLOW = 2, // 现有
// ... 现有 debuff ...
NEW_DEBUFF = 15, // 新增属性型 debuff
}
```
#### 步骤 2: 在 debuffAttrMap 中添加映射
编辑 `getAttrFieldFromDebuff` 函数:
```typescript
export const getAttrFieldFromDebuff = (debuffType: DBuff): number => {
// ... stateDebuffSet ...
const debuffAttrMap: Record<DBuff, number> = {
// ... 现有映射 ...
[DBuff.NEW_DEBUFF]: Attrs.DEF, // 新增映射到防御
};
// ... 其他代码 ...
}
```
#### 步骤 3: 在技能中使用
```typescript
debuffs: [
{
debuff: DBuff.NEW_DEBUFF,
BType: BType.VALUE,
dev: 10,
deC: 6,
deR: 80
}
]
```
---
### 添加状态型 Debuff
编辑 `assets/script/game/common/config/SkillSet.ts`
#### 步骤 1: 在 DBuff enum 中添加新类型
```typescript
export enum DBuff {
STUN = 1,
SLOW = 2,
// ... 现有 debuff ...
FREEZE = 20, // 新增状态型 debuff
}
```
#### 步骤 2: 在 stateDebuffSet 中添加(不需要映射)
编辑 `getAttrFieldFromDebuff` 函数:
```typescript
export const getAttrFieldFromDebuff = (debuffType: DBuff): number => {
// 状态类 debuff只需缓存不影响属性
const stateDebuffSet = new Set<DBuff>([
DBuff.FREEZE, // 新增状态型 debuff
]);
// 检查是否是状态类 debuff
if (stateDebuffSet.has(debuffType)) {
return -1; // 表示只缓存,不影响属性
}
// ... 其他代码 ...
}
```
#### 步骤 3: 在技能中使用
```typescript
debuffs: [
{
debuff: DBuff.FREEZE,
BType: BType.VALUE, // 通常为数值型
dev: 0, // 状态型可以为 0
deC: 4, // 持续 4 秒
deR: 100
}
]
```
#### 步骤 4: 在战斗系统中检查状态
状态型 debuff 被缓存在 `stateDebuffPerm``stateDebuffTemp` Set 中,支持最简洁的访问:
```typescript
// 最推荐:一行代码检查状态
if (heroView.hasState(DBuff.STUN)) {
// 眩晕状态下无法行动
}
// 直接 Set 访问(等价)
if (heroView.stateDebuffTemp.has(DBuff.STUN)) {
// 眩晕状态下无法行动
}
// 同时检查持久和临时状态
if (heroView.stateDebuffPerm.has(DBuff.FREEZE) ||
heroView.stateDebuffTemp.has(DBuff.FREEZE)) {
// 冰冻状态,移动速度降低
moveSpeed *= 0.5;
}
```
---
## 📝 扩展检查清单
### 添加属性型 Debuff 时
- [ ] 在 DBuff enum 中添加新类型
- [ ] 在 debuffAttrMap 中添加映射到对应的 Attrs
- [ ] 确保映射的 Attrs 有效
- [ ] 在技能配置中使用
- [ ] 测试属性是否正确修改
### 添加状态型 Debuff 时
- [ ] 在 DBuff enum 中添加新类型
- [ ] 在 stateDebuffSet 中添加
- [ ] ⚠️ **不要** 在 debuffAttrMap 中添加映射
- [ ] 在技能配置中使用
- [ ] 在战斗系统中添加状态检查逻辑
- [ ] 测试状态缓存是否正确
---
## 🎮 完整示例
### 示例 1: 属性型 Debuff - 减攻击
```typescript
// DBuff enum
export enum DBuff {
WEAKEN = 15, // 新增:减弱攻击
}
// 映射
const debuffAttrMap = {
[DBuff.WEAKEN]: Attrs.AP, // 直接减攻击力
};
// 技能使用
6010: {
debuffs: [
{
debuff: DBuff.WEAKEN,
BType: BType.RATIO,
dev: 30, // 减少 30% 攻击
deC: 5, // 持续 5 秒
deR: 100
}
]
}
// 自动效果:目标攻击力降低 30%
```
### 示例 2: 状态型 Debuff - 中毒
```typescript
// DBuff enum
export enum DBuff {
POISON = 16, // 新增:中毒
}
// 状态集合
const stateDebuffSet = new Set<DBuff>([
DBuff.POISON, // 只缓存,不影响属性
]);
// 技能使用
6011: {
debuffs: [
{
debuff: DBuff.POISON,
BType: BType.VALUE,
dev: 0, // 状态型可以为 0
deC: 8, // 持续 8 秒
deR: 70 // 70% 触发
}
]
}
// 战斗系统检查
if (checkState(targetHero, DBuff.POISON)) {
// 每秒损失血量
targetHero.hp -= 5;
}
```
---
## 🔄 状态型 Debuff 的应用场景
- **控制类**:眩晕、冰冻、缠绕
- **异常类**:中毒、流血、灼烧
- **减益类**:沉默、禁疗、虚弱
- **特殊**:任何需要在战斗系统检查的状态
状态型 debuff 不直接修改属性,而是作为标记,由战斗系统根据状态采取不同的行动。
---
## 📞 获取帮助
遇到问题检查:
1. 是否正确区分了属性型和状态型 debuff
2. 属性型 debuff 是否添加了映射?
3. 状态型 debuff 是否添加到了 stateDebuffSet
4. 状态检查逻辑是否添加到战斗系统?
---
**系统设计充分考虑了扩展性,添加新 buff/debuff 无需修改核心逻辑!** 🎉