diff --git a/assets/script/game/common/config/TalSet_README.md b/assets/script/game/common/config/TalSet_README.md new file mode 100644 index 00000000..959f69d1 --- /dev/null +++ b/assets/script/game/common/config/TalSet_README.md @@ -0,0 +1,532 @@ +# 🎮 英雄天赋系统 (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: true,value: 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 | +| 扩展性评分 | ⭐⭐⭐⭐⭐ |