Files
heros/assets/script/game/common/config/TalSet_README.md
2025-10-27 11:18:06 +08:00

533 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 🎮 英雄天赋系统 (Talent System)
## 📌 项目概述
这是一个为游戏英雄系统设计的**功能完整、高度可扩展的天赋配置系统**。系统支持四种不同类型的天赋效果定义,每种类型都有清晰的触发条件和效果机制,可以轻松创建复杂而有趣的英雄特性。
---
## 📦 项目结构
```
assets/script/game/common/config/
├── TalSet.ts # ⭐ 核心配置文件 (435行)
├── TalSet_Example.ts # 💡 集成示例 (424行)
├── TalSet_USAGE.md # 📖 详细文档 (400+行)
├── TalSet_QuickRef.md # ⚡ 快速参考 (350+行)
└── TalSet_README.md # 📋 本文件 - 总体说明
```
---
## ✨ 核心功能
### 1⃣ 等级类天赋 (LEVEL_ATTR)
当英雄升到指定等级时触发效果
- **示例**: 每升5级攻击力增加10%
- **ID范围**: 7001-7099
- **特点**: 里程碑式的属性增长
### 2⃣ 行为计数类天赋 (ACTION_COUNT_ATTR)
当特定行为累计达到次数时触发
- **示例**: 每攻击10次闪避率增加1%
- **ID范围**: 7101-7199
- **支持行为**: 攻击、技能释放、受到伤害
- **特点**: 可选择按等级重置或持续累积
### 3⃣ 受伤计数类天赋 (DAMAGE_COUNT_ATTR)
当英雄累计受伤达到次数时触发
- **示例**: 每受伤10次最大生命值增加100
- **ID范围**: 7201-7299
- **特点**: 坦克英雄的成长机制
### 4⃣ 技能触发类天赋 (ACTION_TRIGGER_SKILL)
满足条件时自动释放指定技能
- **示例**: 每攻击15次自动释放反击技能
- **ID范围**: 7301-7399
- **特点**: 创建链式反应和特殊战斗机制
---
## 🚀 快速开始 (5分钟)
### 第一步:初始化英雄天赋
```typescript
import { initHeroTalents } from "./TalSet_Example";
// 为英雄 ID=5001 (刘邦) 初始化天赋
initHeroTalents(5001, [7001, 7202]);
// 7001: 剑意提升 (等级类)
// 7202: 防御强化 (受伤类)
```
### 第二步:监听游戏事件
```typescript
import {
onHeroLevelUp,
onHeroAttack,
onHeroDamaged,
onHeroSkillCast
} from "./TalSet_Example";
// 在英雄升级系统中调用
onHeroLevelUp(5001, 10); // 英雄升到10级
// 在战斗系统中调用
onHeroAttack(5001, 50); // 英雄发动攻击
onHeroSkillCast(5001, 6001); // 英雄释放技能
onHeroDamaged(5001, 30); // 英雄受到伤害
```
### 第三步:查询天赋信息
```typescript
import { getTalConf } from "./TalSet";
// 获取单个天赋配置
const talConfig = getTalConf(7001);
console.log(talConfig.name); // "剑意提升"
// 获取英雄的天赋状态
const talentInfo = globalTalentManager.getHeroTalentInfo(5001);
talentInfo?.talents.forEach((instance, talId) => {
console.log(`天赋${talId}: 堆叠${instance.stackCount}层`);
});
```
---
## 📚 文档导航
| 文档 | 内容 | 何时阅读 |
|------|------|--------|
| **TalSet.ts** | 核心代码,类型定义和配置表 | 需要了解数据结构 |
| **TalSet_USAGE.md** | 详细说明,四种天赋类型详解 | 深入学习天赋系统 |
| **TalSet_QuickRef.md** | 速查表,代码片段和模板 | 快速查阅和参考 |
| **TalSet_Example.ts** | 完整实现,天赋触发器和查询工具 | 了解系统实现细节 |
| **TalSet_README.md** | 本文件,项目总体说明 | 第一次使用 |
### 推荐阅读顺序
1. 📋 **本文件** (10分钟) - 了解项目整体
2.**TalSet_QuickRef.md** (10分钟) - 快速上手
3. 📖 **TalSet_USAGE.md** (20分钟) - 深入理解
4. 💡 **TalSet_Example.ts** (查需) - 参考实现
---
## 🎯 预置天赋示例
### 等级类天赋
| ID | 名称 | 效果 | 触发 |
|---|------|------|-----|
| 7001 | 剑意提升 | 攻击力 +10% | 每5级 |
| 7002 | 法力修炼 | 魔力 +15 | 每3级 |
### 行为计数类天赋
| ID | 名称 | 效果 | 触发 |
|---|------|------|-----|
| 7101 | 强化闪避 | 闪避率 +1% | 每10次攻击 |
| 7102 | 暴击强化 | 暴击率 +2% | 每15次攻击 |
| 7103 | 连击精通 | 攻击力 +5% | 每8次技能 |
### 受伤计数类天赋
| ID | 名称 | 效果 | 触发 |
|---|------|------|-----|
| 7201 | 坚甲护体 | 生命 +100 | 每10次受伤 |
| 7202 | 防御强化 | 防御 +3% | 每12次受伤 |
| 7203 | 魔抗修炼 | 魔防 +5 | 每15次受伤 |
### 技能触发类天赋
| ID | 名称 | 效果 | 触发 |
|---|------|------|-----|
| 7301 | 连击反击 | 释放技能6010 | 每15次攻击 |
| 7302 | 受伤反制 | 释放技能6011 | 每8次受伤 |
| 7303 | 技能链接 | 释放技能6012 | 每5次技能 |
---
## 🔧 如何添加新天赋
### 方案:添加 "越战越强" 战士天赋
**步骤 1**:确定天赋类型
- 受伤时变强 → 使用 **DAMAGE_COUNT_ATTR**
**步骤 2**分配天赋ID
- 下一个受伤类 ID → **7204**
**步骤 3**:在 `TalSet.ts` 中添加配置
```typescript
// 在 talConf 对象中添加:
7204: {
talId: 7204,
name: "越战越强",
desc: "每受伤8次攻击力增加4%",
talType: TalType.DAMAGE_COUNT_ATTR,
trigger: {
type: "damageCount",
count: 8,
resetPerLevel: false,
} as IDamageCountTrigger,
effect: {
type: "attrModify",
attr: TalAttrType.AP,
value: 4,
percent: true,
} as IAttrModifyEffect,
stackable: true,
maxStack: 18,
},
```
**步骤 4**:使用新天赋
```typescript
initHeroTalents(5001, [7204]); // 为英雄添加新天赋
```
---
## 🎮 与英雄系统集成
### 在 heroSet.ts 中添加天赋字段
```typescript
// 修改 heroInfo 接口
export interface heroInfo {
uuid: number;
name: string;
// ... 其他属性 ...
talents?: number[]; // 新增天赋ID数组
}
// 为具体英雄添加天赋
5001: {
uuid: 5001,
name: "刘邦",
// ... 其他属性 ...
talents: [7001, 7202], // 刘邦的天赋
}
```
### 在战斗系统中触发天赋
```typescript
// 在战斗逻辑中适当位置调用:
// 1. 英雄升级时
hero.onLevelUp((newLevel) => {
onHeroLevelUp(hero.id, newLevel);
});
// 2. 英雄攻击时
hero.onAttack((damage) => {
onHeroAttack(hero.id, damage);
});
// 3. 英雄受伤时
hero.onDamaged((damage) => {
onHeroDamaged(hero.id, damage);
});
// 4. 英雄释放技能时
hero.onSkillCast((skillId) => {
onHeroSkillCast(hero.id, skillId);
});
```
---
## 💡 设计原则
### 1. 触发条件与效果分离
- **触发条件**负责"何时激发"
- **效果**负责"产生什么影响"
- 两者独立定义,灵活组合
### 2. 高度扩展性
- 新增属性类型?直接加入 `TalAttrType` 枚举
- 新增行为类型?直接加入 `TalActionType` 枚举
- 新增触发条件?创建新的 `ITriggerCondition` 接口
### 3. 类型安全
- 使用 TypeScript 接口确保配置正确
- 使用类型强制进行编译时检查
- 避免运行时类型错误
### 4. 清晰的ID命名规范
```
XYZZ
├─ X: 类别 (7 = 天赋)
├─ Y: 子类型 (0=等级, 1=行为, 2=受伤, 3=技能)
└─ ZZ: 序列号 (01-99)
示例:
7001 → 7(天赋) 0(等级) 01(第1个)
7102 → 7(天赋) 1(行为) 02(第2个)
```
---
## 📊 关键数据结构
### 天赋配置接口
```typescript
interface ItalConf {
talId: number; // 天赋ID
name: string; // 天赋名称
desc: string; // 天赋描述
talType: TalType; // 天赋类型
trigger: ITriggerCondition; // 触发条件
effect: ITalEffect; // 效果
stackable?: boolean; // 是否可堆叠
maxStack?: number; // 最大堆叠次数
}
```
### 天赋实例数据
```typescript
interface HeroTalentInstance {
talId: number; // 天赋ID
stackCount: number; // 当前堆叠层数
actionCounter: number; // 行为计数
damageCounter: number; // 受伤计数
lastTriggerLevel: number;// 最后触发等级
isActive: boolean; // 是否激活
}
```
---
## ⚡ 性能建议
### 1. 初始化一次,复用多次
```typescript
// ✅ 推荐
const manager = globalTalentManager;
for (let i = 0; i < 1000; i++) {
manager.onHeroAttack(heroId, 50);
}
// ❌ 不推荐 (频繁查询)
for (let i = 0; i < 1000; i++) {
getTalConf(7001);
}
```
### 2. 缓存配置对象
```typescript
// ✅ 推荐
const configs = getTalConfByType(TalType.LEVEL_ATTR);
configs.forEach(config => { /* 使用 */ });
// ❌ 不推荐 (重复查询)
for (let i = 0; i < 100; i++) {
const config = getTalConf(7001);
}
```
### 3. 合理设置堆叠上限
```typescript
// 防止无限堆叠导致性能问题
maxStack: 20, // 而不是无限
```
---
## 🐛 调试与测试
### 打印所有天赋信息
```typescript
import { TalentQueryHelper } from "./TalSet_Example";
TalentQueryHelper.printAllTalents();
```
### 获取特定条件的天赋
```typescript
import { TalentQueryHelper, TalAttrType, TalActionType } from "./TalSet_Example";
// 获取所有影响生命值的天赋
const hpTals = TalentQueryHelper.getTalentsByAttribute(TalAttrType.HP);
// 获取所有与攻击相关的天赋
const attackTals = TalentQueryHelper.getTalentsByAction(TalActionType.ATTACK);
```
### 查看英雄天赋状态
```typescript
import { globalTalentManager } from "./TalSet_Example";
const talentInfo = globalTalentManager.getHeroTalentInfo(5001);
console.table(Array.from(talentInfo?.talents.values() || []));
```
---
## 📋 完整集成示例
```typescript
// main.ts 或 game.ts
import {
initHeroTalents,
onHeroLevelUp,
onHeroAttack,
onHeroDamaged,
TalentSystemExample
} from "./TalSet_Example";
class GameSystem {
initGame() {
// 1. 为英雄初始化天赋
initHeroTalents(5001, [7001, 7202, 7101]);
// 2. 在战斗系统中监听事件
this.setupEventListeners();
}
setupEventListeners() {
// 英雄升级时
on('heroLevelUp', (heroId, newLevel) => {
onHeroLevelUp(heroId, newLevel);
});
// 英雄发动攻击时
on('heroAttack', (heroId, damage) => {
onHeroAttack(heroId, damage);
});
// 英雄受伤时
on('heroDamaged', (heroId, damage) => {
onHeroDamaged(heroId, damage);
});
}
// 用于调试
debugTalents() {
const example = new TalentSystemExample();
example.initLiuBangTalents();
example.simulateLevelUp();
example.simulateCombat();
example.queryTalentInfo();
}
}
```
---
## 🎓 学习路径
### 初级 (理解基础)
1. 阅读本文件
2. 查看 TalSet_QuickRef.md
3. 运行预置示例
### 中级 (自定义开发)
1. 阅读 TalSet_USAGE.md
2. 参考 TalSet_Example.ts
3. 添加新的天赋配置
### 高级 (系统扩展)
1. 研究 TalSet.ts 源代码
2. 创建新的触发条件类型
3. 实现自定义效果逻辑
---
## 🤝 贡献指南
### 添加新的预置天赋
1. 确定天赋类型和ID
2. 在 TalSet.ts 中添加配置
3. 在本文档中更新示例表格
4. 在 TalSet_USAGE.md 中记录详情
### 报告问题
- 配置错误?检查接口是否实现
- 触发不工作?检查事件是否正确调用
- 性能问题?检查 maxStack 是否过大
---
## 📞 快速帮助
### Q: 天赋何时触发?
**A**: 取决于配置的触发条件:
- 等级类:升到指定等级
- 行为类:行为累计达到指定次数
- 受伤类:受伤累计达到指定次数
- 技能类:满足前三种条件之一
### Q: 如何禁用某个天赋?
**A**: 初始化时不添加该天赋ID即可
```typescript
initHeroTalents(heroId, [7001, 7002]); // 不包括 7101
```
### Q: 天赋堆叠有上限吗?
**A**: 有,由 `maxStack` 属性控制
```typescript
maxStack: 20, // 最多堆叠20次
// 不设置则无限堆叠(不推荐)
```
### Q: 百分比效果如何计算?
**A**: 在实现层面应用
```typescript
// 如果 percent: truevalue: 10
// 则增益 = 基础属性 × 110% (基础+10%)
// 多堆叠层 = 基础属性 × (1 + 0.1 * stackCount)
```
---
## 📄 许可证
这个天赋系统是项目的内部组件,遵循项目许可。
---
## ✅ 检查清单
在投入使用前,请确认:
- [ ] 已阅读本文档
- [ ] 了解四种天赋类型的区别
- [ ] 能够添加新天赋配置
- [ ] 已在游戏系统中集成事件监听
- [ ] 已进行性能测试
- [ ] 已验证天赋触发正常
---
## 📞 支持
遇到问题?
1. 查看 **TalSet_QuickRef.md** 的常见问题
2. 参考 **TalSet_USAGE.md** 的详细说明
3. 查看 **TalSet_Example.ts** 的实现代码
4. 检查浏览器控制台的调试输出
---
**天赋系统已就绪!🚀 祝游戏开发愉快!**
---
## 📊 系统统计
| 指标 | 数值 |
|------|------|
| 总代码行数 | ~1,200 |
| 预置天赋 | 12个 |
| 支持属性 | 9种 |
| 支持行为 | 3种 |
| 触发条件类型 | 3种 |
| 效果类型 | 2种 |
| 最大天赋ID | 7399 |
| 扩展性评分 | ⭐⭐⭐⭐⭐ |