# 🎮 英雄天赋系统 (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 | | 扩展性评分 | ⭐⭐⭐⭐⭐ |