From 175a6e4232309aa43e6ce6595e7eb2d95e19085e Mon Sep 17 00:00:00 2001 From: walkpan Date: Tue, 28 Oct 2025 00:07:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(hero):=20=E9=87=8D=E6=9E=84=E8=8B=B1?= =?UTF-8?q?=E9=9B=84=E9=85=8D=E7=BD=AE=E5=92=8C=E6=B7=BB=E5=8A=A0=E5=A4=A9?= =?UTF-8?q?=E8=B5=8B=E7=B3=BB=E7=BB=9F,=E9=9C=80=E8=A6=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=AA=8C=E8=AF=81=20refactor(heroSet):=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=8B=B1=E9=9B=84=E5=B1=9E=E6=80=A7=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E6=95=B0=E5=80=BC=E5=92=8C=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=20refactor(TalSet):=20=E7=AE=80=E5=8C=96=E5=A4=A9?= =?UTF-8?q?=E8=B5=8B=E7=B3=BB=E7=BB=9F=E7=BB=93=E6=9E=84=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/script/cankao.md | 74 +-- assets/script/game/common/config/TalSet.ts | 396 +------------ .../game/common/config/TalSet_Example.ts | 482 ---------------- .../game/common/config/TalSet_QuickRef.md | 445 --------------- .../game/common/config/TalSet_README.md | 532 ------------------ .../script/game/common/config/TalSet_USAGE.md | 454 --------------- assets/script/game/common/config/heroSet.ts | 58 +- 7 files changed, 93 insertions(+), 2348 deletions(-) delete mode 100644 assets/script/game/common/config/TalSet_Example.ts delete mode 100644 assets/script/game/common/config/TalSet_QuickRef.md delete mode 100644 assets/script/game/common/config/TalSet_README.md delete mode 100644 assets/script/game/common/config/TalSet_USAGE.md diff --git a/assets/script/cankao.md b/assets/script/cankao.md index a1253e84..9a36a02a 100644 --- a/assets/script/cankao.md +++ b/assets/script/cankao.md @@ -1,42 +1,42 @@ # 《吸血鬼幸存者》角色特性总表 -| 角色名称 | 解锁条件 | 初始武器 | 被动技能(核心特性) | 特点/备注 | -|---------|----------|----------|---------------------|-----------| -| **安东尼奥·贝尔帕斯** | 初始角色 | 鞭子 | 每10级增加10%伤害(最高50%) | 致敬《恶魔城》贝尔蒙特家族,前期扎实。 | -| **伊梅尔达·贝尔帕斯** | 10金币购买 | 魔杖 | 每5级增加10%经验获取(最高30%) | 升级更快,适合快速发育。 | -| **帕斯奎丽娜·贝尔帕斯** | 100金币购买 | 符文追踪器 | 每5级增加10%射弹速度(最高30%) | 提升武器飞行速度,增强命中率。 | -| **吉纳罗·贝尔帕斯** | 500金币购买 | 飞刀 | **永久投射物数量+1** | 核心神技,极大增强所有武器的清怪能力。 | -| **阿卡·拉多纳** | 火焰之杖4级后500金购买 | 火焰之杖 | 每10级减少5%冷却(最高15%) | 99级解锁隐藏至宝"火之心"。 | -| **波尔塔·拉多纳** | 闪电戒指4级后500金购买 | 闪电戒指 | 开局冷却-90%,随等级逐渐恢复正常 | 开局强势,前期优势大。 | -| **拉玛·拉多纳** | 诅咒≥10%时生存20分钟 | 斧头 | 每10级增加力量、移速、诅咒(最高20%) | 高风险高回报,后期属性强大。 | -| **波·拉奇奥** | 大蒜7级后500金购买 | 大蒜 | **永久拾取范围+25%**(生命-30) | 磁铁范围加成计算方式特殊,可叠至233%。 | -| **苏奥尔·克莱里奇** | 累计恢复1000生命 | 圣水 | 开局范围+400%,随等级递减 | 前期圣水范围极大,安全度高。 | -| **多马利奥** | 单局赚5000金币 | 国王圣经 | 射弹速度+40%,持续时间+40%,移速-40% | **游戏中移动速度最慢的角色**。 | -| **克罗奇·弗赖托** | 总计击败10万敌人 | 十字架 | 1级和33级各获得一次复活 | 移动速度第二快,生存能力强。 | -| **克莉丝汀·达瓦因** | 五芒星7级后500金购买 | 五芒星 | 冷却时间-25%(生命、力量降低) | 高冷却缩减,需尽快进化五芒星避免损失经验。 | -| **刺·普罗沃拉** | 疯狂森林棺材中解锁 | 菲拉图普罗&八雀(双枪) | **每级力量+1%(无上限)** | 纯粹的大后期角色,成长性极高。 | -| **乔瓦娜·格拉纳** | 图书馆棺材中解锁 | 苦猫 | **每级投射物速度+1%(无上限)** | 搭配圣水、符文追踪器等武器效果佳。 | -| **萝·卜头** | 奶牛场棺材中解锁 | 魔法之歌 | **每级武器效果持续时间+1%(无上限)** | 增强圣水、国王圣经等持续型武器。 | -| **莫塔乔** | 总计击败3000骷髅 | 骨头 | 每20级投射物+1(最高+3) | 20级前较弱,60级后配合道具可达+6投射物。 | -| **雅塔·卡瓦洛** | 总计击败3000狮头 | 樱桃炸弹 | 每20级投射物+1(最高+3) | 特性同莫塔乔,20级前是弱势期。 | -| **比安卡·兰巴** | 总计击败3000牛奶精灵 | 卡雷洛 | 每20级投射物+1(最高+3) | 特性同莫塔乔,20级前是弱势期。 | -| **O'Sole** | 总计击败3000龙虾 | 天体除尘 | 每20级投射物+1(最高+3) | 特性同莫塔乔,输入"PET"有隐藏彩蛋(治疗)。 | -| **御堂纲纪** | 在宫古城往东走,路过通往连接领域的大门后打开棺材解锁 | 花剑 | 每20级,获得一个傀儡作为随从(最多+4) | 濒死时触发"独秀专场"。需先解锁他才能解锁"腥风血雨"武器。 | -| **邦妮** | 完全进化武器"腥风血雨" | 冲拳 | 默认与福米娜组队进入关卡 | 解锁后可装备踢击。濒死时触发"独秀专场"。 | -| **福米娜** | 完全进化武器"踢击" | 利剑机枪 | 默认与邦妮组队进入关卡 | 解锁后可装备鹰隼神枪。濒死时触发"独秀专场"。 | -| **5号歌姬** | 完全进化武器"鹰隼神枪" | 超级导弹 | 拥有6种不同属性的皮肤 | 解锁后可装备双龙刀。所有皮肤状态下濒死时均触发"独秀专场"。 | -| **阿米亚** | 完全进化武器"双龙刀" | 精灵戒指或直觉 | 收集她召唤的猫时会变得更强 | 在濒死时会触发"独秀专场"。 | -| **西乌纳斯** | 击败连接领域所有部分的BOSS及最终BOSS后,在东边打开棺材解锁 | 市剑 | 被击败的敌人会成为随从,生命值上限提高时随从上限也随之提高 | 在濒死时会触发"独秀专场"。 | -| **末代皇帝** | 使用邦妮或福米娜,在"翻转翡翠模型"中的格雷隆击败其恶魔形态 | 火焰大剑 | 触发点亮攻击的频率更高 | 在濒死时会触发"独秀专场"。 | -| **多洛雷斯** | 使用西乌纳斯,在"翻转翡翠模型"中的黄泉击败特定BOSS | 布洛瓦战斧 | 在"濒死遗迹"中,每次有角色复活(包括自己)时触发"独秀专场" | 机制独特,与复活体系联动。 | -| **玛查** | 使用阿米亚,在"翻转翡翠模型"中的阿瓦隆击败特定BOSS | 库库里匕首和隐藏的灾厄戒指 | 敌人生成数量+50% | 在濒死时会触发"独秀专场",高难度角色。 | -| **丽塔** | 使用纲纪,在"翻转翡翠模型"中的普尔克拉击败土龙 | 长柄刀 | 开局即可使用特技"天雷" | 在濒死时会触发"独秀专场"。 | -| **傀儡** | 在"翻转翡翠模型"中的宫古城击败木之神灵 | 双龙刀(武藏皮肤) | 具有四种皮肤,每点亮一个新特技可获得1次复活和5%成长属性 | 皮肤对应不同初始武器:武藏(双龙刀)/小町(库库里匕首)/坊(鹰隼神枪)/宿祢(冲拳)。 | -| **老师** | 使用5号歌姬,在"翻转翡翠模型"中的翻转普罗维登斯击败活体苦恼 | 直觉 | 每20级,飞射物增加,最多+4 | 点亮技能高超。 | -| **洛洛、嘶嘶、喵喵和呼噜** | 使用阿米亚,需要彪悍猫(升满级),通过各种方式尽量增加彪悍猫出现的数量 | (依形态而定) | 每次触发"独秀专场"时获得一名随从 | 此为阿米亚的不同形态,在濒死时会触发"独秀专场"。 | -| **喜纳** | 通关一次后,再次进入翡翠模型然后立即退出(若未解锁可尝试在角色触发独秀专场后再死亡) | 无 | 天生知晓特技"飞燕切"和"疾风剑" | 濒死触发"独秀专场"时获得额外力量。 | -| **今琥** | 使用5号歌姬和魔力歌谣击败活体苦恼 | 无 | 天生知晓特技"地狱断面"和"鲜血狂怒" | 濒死触发"独秀专场"时获得额外力量。 | -| **门之邪灵** | 在冰冻状态下击败格雷隆的BOSS(如使用时之柳叶刀或卡牌时空的跨越等道具) | 鲜血圣杯 | 天生知晓"朱砂"特技 | 解锁方式特殊,需利用冰冻效果。 | +| 被动技能(核心特性) | +|---------------------| +| 每10级增加10%伤害(最高50%) | +| 每5级增加10%经验获取(最高30%) | +| 每5级增加10%普通攻击速度(最高30%) | +| **永久投射物数量+1** | +| 每10级减少5%冷却(最高15%) | +| 开局冷却-90%,随等级逐渐恢复正常 | +| 每10级增加力量、移速、诅咒(最高20%) | +| **永久金币收益+25%**(生命-30) | +| 开局范围+400%,随等级递减 | +| 普通攻击速度+40%,持续时间+40%,移速-40% | +| 1级和33级各获得一次复活 | +| 冷却时间-25%(生命、力量降低) | +| **每级力量+1%(无上限)** | +| **每级普通攻击速度+1%(无上限)** | +| **每级武器效果持续时间+1%(无上限)** | +| 每20级投射物+1(最高+3) | +| 每20级投射物+1(最高+3) | +| 每20级投射物+1(最高+3) | +| 每20级投射物+1(最高+3) | +| 每20级,获得一个傀儡作为随从(最多+4) | +| 默认与福米娜组队进入关卡 | +| 默认与邦妮组队进入关卡 | +| 拥有6种不同属性的皮肤 | +| 收集她召唤的猫时会变得更强 | +| 被击败的敌人会成为随从,生命值上限提高时随从上限也随之提高 | +| 触发点亮攻击的频率更高 | +| 在"濒死遗迹"中,每次有角色复活(包括自己)时触发"独秀专场" | +| 敌人生成数量+50% | +| 开局即可使用特技"天雷" | +| 具有四种皮肤,每点亮一个新特技可获得1次复活和5%成长属性 | +| 每20级,飞射物增加,最多+4 | +| 每次触发"独秀专场"时获得一名随从 | +| 天生知晓特技"飞燕切"和"疾风剑" | +| 天生知晓特技"地狱断面"和"鲜血狂怒" | +| 天生知晓"朱砂"特技 | ## 表格说明 * **加粗文本**表示该角色的核心优势或特色机制 diff --git a/assets/script/game/common/config/TalSet.ts b/assets/script/game/common/config/TalSet.ts index 5ba13326..fadc6ccf 100644 --- a/assets/script/game/common/config/TalSet.ts +++ b/assets/script/game/common/config/TalSet.ts @@ -3,111 +3,32 @@ * 支持定义英雄的特殊能力或特性 */ +import { Attrs } from "./HeroAttrs"; + // ========== 枚举定义 ========== /** - * 天赋类型枚举 + * 天赋类型枚举,也是触发条件 */ export enum TalType { - LEVEL_ATTR = 1, // 基于等级的属性增长 - ACTION_COUNT_ATTR = 2, // 基于行为计数的属性变化 - DAMAGE_COUNT_ATTR = 3, // 基于受伤次数的属性提升 - ACTION_TRIGGER_SKILL = 4, // 基于行为触发的技能释放 + LEVEL_TRIGGER = 1, // 基于等级触发 + ACTION_COUNT_TRIGGER = 2, // 基于普通攻击触发, skills[0]计数触发 + SKILL_COUNT_TRIGGER = 3, // 基于技能触发, > skills[0]计数触发 + DAMAGE_COUNT_TRIGGER = 4, // 基于受伤次数触发 + INIT_TRIGGER = 5, // 初始触发,如:多1个技能 + DEAD_TRIGGER = 6 // 基于死亡触发 } /** - * 属性类型枚举 + * 触发效果 */ -export enum TalAttrType { - HP = "hp", // 最大生命值 - MP = "mp", // 最大魔力值 - AP = "ap", // 攻击力 - MAP = "map", // 魔法攻击力 - DEF = "def", // 防御力 - MDEF = "mdef", // 魔法防御力 - SPEED = "speed", // 移动速度 - DODGE = "dodge", // 闪避率 - CRIT = "crit", // 暴击率 +export enum TalEffectType { + ATTR_MODIFY = 1, // 属性修改 + SKILL_TRIGGER = 2, // 技能触发 + SKILL_MORE = 3, // 天生多1个技能 } -/** - * 行为类型枚举 - */ -export enum TalActionType { - ATTACK = 1, // 攻击 - SKILL = 2, // 使用技能 - DAMAGED = 3, // 受伤 -} -// ========== 触发条件接口 ========== - -/** - * 触发条件基础接口 - */ -export interface ITriggerCondition { - type: "level" | "actionCount" | "damageCount"; -} - -/** - * 等级触发条件 - * 当英雄达到指定等级时触发 - */ -export interface ILevelTrigger extends ITriggerCondition { - type: "level"; - level: number; // 触发的等级阈值(如5级触发一次) -} - -/** - * 行为计数触发条件 - * 当特定行为累计达到指定次数时触发 - */ -export interface IActionCountTrigger extends ITriggerCondition { - type: "actionCount"; - actionType: TalActionType; // 要计数的行为类型 - count: number; // 触发的计数阈值 - resetPerLevel?: boolean; // 是否每升一级重置计数(默认false,不重置) -} - -/** - * 受伤次数触发条件 - * 当英雄累计受伤达到指定次数时触发 - */ -export interface IDamageCountTrigger extends ITriggerCondition { - type: "damageCount"; - count: number; // 触发的受伤次数阈值 - resetPerLevel?: boolean; // 是否每升一级重置计数(默认false,不重置) -} - -// ========== 效果接口 ========== - -/** - * 效果基础接口 - */ -export interface ITalEffect { - type: "attrModify" | "skillTrigger"; -} - -/** - * 属性修改效果 - * 对指定属性进行修改:增加/减少固定值或百分比 - */ -export interface IAttrModifyEffect extends ITalEffect { - type: "attrModify"; - attr: TalAttrType; // 修改的属性名 - value: number; // 修改值(正数增加,负数减少) - percent?: boolean; // 是否为百分比修改(默认false,为固定值) -} - -/** - * 技能触发效果 - * 自动触发指定的技能 - */ -export interface ISkillTriggerEffect extends ITalEffect { - type: "skillTrigger"; - skillId: number; // 要触发的技能ID -} - -// ========== 天赋配置接口 ========== /** * 天赋配置接口 @@ -117,9 +38,11 @@ export interface ItalConf { talId: number; // 天赋ID name: string; // 天赋名称 desc: string; // 天赋描述(说明触发条件和效果) - talType: TalType; // 天赋类型 - trigger: ITriggerCondition; // 触发条件 - effect: ITalEffect; // 效果 + type: TalType; + triggerType: TalEffectType; // 触发效果类型 + t_value: number; // 触发的阈值(如5级触发一次, 5次攻击触发一次,初始触发) + e_value: number; // 触发的效果值(如增加10%攻击力, 触发的技能uuid,增加1个技能uuid) + e_count?: number; // 触发效果的累计次数(如触发2次技能实现召唤2个召唤物) stackable?: boolean; // 是否可堆叠效果(默认true) maxStack?: number; // 最大堆叠次数(不设置表示无限制) } @@ -127,8 +50,8 @@ export interface ItalConf { // ========== 天赋配置表 ========== /** - * 天赋配置表 - * 存储所有天赋的配置信息 + * 天赋配置表 - 一维数组格式 + * 存储所有天赋的配置信息,采用2行紧凑格式 * * 使用说明: * 1. 等级类天赋:当英雄升级到指定等级时,每次都会触发效果 @@ -136,274 +59,15 @@ export interface ItalConf { * 3. 受伤计数类:当受伤累计达到阈值时触发,支持是否重置计数 * 4. 技能触发类:当特定条件满足时自动触发指定技能 */ -export const talConf: Record = { +export const talConf: ItalConf[] = [ // ========== 等级类天赋 ========== /** * 剑意提升 - 刘邦专属 * 每升5级,攻击力增加10% */ - 7001: { - talId: 7001, - name: "剑意提升", - desc: "每升5级,攻击力增加10%", - talType: TalType.LEVEL_ATTR, - trigger: { - type: "level", - level: 5, - } as ILevelTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.AP, - value: 10, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, // 最多堆叠到100级 - }, - - /** - * 法力修炼 - 通用 - * 每升3级,最大魔力值增加15点 - */ - 7002: { - talId: 7002, - name: "法力修炼", - desc: "每升3级,最大魔力值增加15点", - talType: TalType.LEVEL_ATTR, - trigger: { - type: "level", - level: 3, - } as ILevelTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.MP, - value: 15, - percent: false, - } as IAttrModifyEffect, - stackable: true, - maxStack: 33, - }, - - // ========== 行为计数类天赋 ========== - - /** - * 强化闪避 - 敏捷英雄 - * 每攻击10次,闪避率增加1% - * 不按等级重置,持续累积 - */ - 7101: { - talId: 7101, - name: "强化闪避", - desc: "每攻击10次,闪避率增加1%", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 10, - resetPerLevel: false, - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.DODGE, - value: 1, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, - }, - - /** - * 暴击强化 - 刺客 - * 每攻击15次,暴击率增加2% - */ - 7102: { - talId: 7102, - name: "暴击强化", - desc: "每攻击15次,暴击率增加2%", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 15, - resetPerLevel: false, - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.CRIT, - value: 2, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 15, - }, - - /** - * 连击精通 - 战士 - * 每使用技能8次,攻击力增加5% - */ - 7103: { - talId: 7103, - name: "连击精通", - desc: "每使用技能8次,攻击力增加5%", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.SKILL, - count: 8, - resetPerLevel: false, - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.AP, - value: 5, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 18, - }, - - // ========== 受伤计数类天赋 ========== - - /** - * 坚甲护体 - 重装战士 - * 每受伤10次,最大生命值增加100点 - */ - 7201: { - talId: 7201, - name: "坚甲护体", - desc: "每受伤10次,最大生命值增加100点", - talType: TalType.DAMAGE_COUNT_ATTR, - trigger: { - type: "damageCount", - count: 10, - resetPerLevel: false, - } as IDamageCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.HP, - value: 100, - percent: false, - } as IAttrModifyEffect, - stackable: true, - maxStack: 15, - }, - - /** - * 防御强化 - 防守型 - * 每受伤12次,防御力增加3% - */ - 7202: { - talId: 7202, - name: "防御强化", - desc: "每受伤12次,防御力增加3%", - talType: TalType.DAMAGE_COUNT_ATTR, - trigger: { - type: "damageCount", - count: 12, - resetPerLevel: false, - } as IDamageCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.DEF, - value: 3, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, - }, - - /** - * 魔抗修炼 - 法系英雄 - * 每受伤15次,魔法防御增加5点 - */ - 7203: { - talId: 7203, - name: "魔抗修炼", - desc: "每受伤15次,魔法防御增加5点", - talType: TalType.DAMAGE_COUNT_ATTR, - trigger: { - type: "damageCount", - count: 15, - resetPerLevel: false, - } as IDamageCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.MDEF, - value: 5, - percent: false, - } as IAttrModifyEffect, - stackable: true, - maxStack: 12, - }, - - // ========== 技能触发类天赋 ========== - - /** - * 连击反击 - 刺客 - * 每攻击15次,自动触发反击技能(假设技能ID为6010) - */ - 7301: { - talId: 7301, - name: "连击反击", - desc: "每攻击15次,自动触发反击技能", - talType: TalType.ACTION_TRIGGER_SKILL, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 15, - resetPerLevel: true, // 每升级重置计数 - } as IActionCountTrigger, - effect: { - type: "skillTrigger", - skillId: 6010, - } as ISkillTriggerEffect, - stackable: false, // 技能触发类天赋不堆叠 - }, - - /** - * 受伤反制 - 防守型 - * 每受伤8次,自动触发反制护盾技能(假设技能ID为6011) - */ - 7302: { - talId: 7302, - name: "受伤反制", - desc: "每受伤8次,自动触发反制护盾技能", - talType: TalType.ACTION_TRIGGER_SKILL, - trigger: { - type: "damageCount", - count: 8, - resetPerLevel: true, - } as IDamageCountTrigger, - effect: { - type: "skillTrigger", - skillId: 6011, - } as ISkillTriggerEffect, - stackable: false, - }, - - /** - * 技能链接 - 法师 - * 每使用技能5次,自动触发增强魔法技能(假设技能ID为6012) - */ - 7303: { - talId: 7303, - name: "技能链接", - desc: "每使用技能5次,自动触发增强魔法技能", - talType: TalType.ACTION_TRIGGER_SKILL, - trigger: { - type: "actionCount", - actionType: TalActionType.SKILL, - count: 5, - resetPerLevel: true, - } as IActionCountTrigger, - effect: { - type: "skillTrigger", - skillId: 6012, - } as ISkillTriggerEffect, - stackable: false, - }, -}; + +]; // ========== 工具函数 ========== @@ -413,22 +77,14 @@ export const talConf: Record = { * @returns 天赋配置,不存在返回undefined */ export const getTalConf = (talId: number): ItalConf | undefined => { - return talConf[talId]; + return talConf.find(tal => tal.talId === talId); }; -/** - * 获取指定类型的所有天赋 - * @param talType 天赋类型 - * @returns 天赋配置数组 - */ -export const getTalConfByType = (talType: TalType): ItalConf[] => { - return Object.values(talConf).filter(tal => tal.talType === talType); -}; /** * 获取所有天赋ID列表 * @returns 天赋ID数组 */ export const getAllTalIds = (): number[] => { - return Object.keys(talConf).map(Number); + return talConf.map(tal => tal.talId); }; diff --git a/assets/script/game/common/config/TalSet_Example.ts b/assets/script/game/common/config/TalSet_Example.ts deleted file mode 100644 index ba0b238d..00000000 --- a/assets/script/game/common/config/TalSet_Example.ts +++ /dev/null @@ -1,482 +0,0 @@ -/** - * 天赋系统集成示例 - * 展示如何在实际游戏系统中使用 TalSet 配置 - */ - -import { - TalType, - TalAttrType, - TalActionType, - ItalConf, - getTalConf, - getTalConfByType, - getAllTalIds, - talConf -} from "./TalSet"; - -// ========== 天赋实时数据结构 ========== - -/** - * 英雄天赋实例数据 - * 记录单个英雄某个天赋的实时数据 - */ -export interface HeroTalentInstance { - talId: number; // 天赋ID - stackCount: number; // 当前堆叠层数 - actionCounter: number; // 行为计数器(用于计数类天赋) - damageCounter: number; // 受伤计数器(用于受伤类天赋) - lastTriggerLevel: number; // 最后一次触发的等级(用于等级类天赋) - isActive: boolean; // 是否激活 -} - -/** - * 英雄天赋管理数据 - * 记录一个英雄的所有天赋数据 - */ -export interface HeroTalentManager { - heroId: number; - talents: Map; -} - -// ========== 天赋触发系统 ========== - -/** - * 天赋触发管理器 - * 处理天赋的所有触发逻辑 - */ -export class TalentTriggerManager { - private talentInstances: Map = new Map(); - - /** - * 初始化英雄的天赋系统 - * @param heroId 英雄ID - * @param talentIds 天赋ID数组 - */ - public initHeroTalents(heroId: number, talentIds: number[]): void { - const talentManager: HeroTalentManager = { - heroId, - talents: new Map(), - }; - - talentIds.forEach(talId => { - const talConfig = getTalConf(talId); - if (talConfig) { - talentManager.talents.set(talId, { - talId, - stackCount: 0, - actionCounter: 0, - damageCounter: 0, - lastTriggerLevel: 0, - isActive: true, - }); - } - }); - - this.talentInstances.set(heroId, talentManager); - } - - /** - * 处理英雄等级提升事件 - * @param heroId 英雄ID - * @param newLevel 新等级 - */ - public onHeroLevelUp(heroId: number, newLevel: number): void { - const talentManager = this.talentInstances.get(heroId); - if (!talentManager) return; - - talentManager.talents.forEach((instance, talId) => { - const talConfig = getTalConf(talId); - if (!talConfig || talConfig.talType !== TalType.LEVEL_ATTR) return; - - const levelTrigger = talConfig.trigger as any; - const triggerInterval = levelTrigger.level; - - // 检查是否应该触发 - if (newLevel % triggerInterval === 0) { - // 检查是否还能堆叠 - if (talConfig.maxStack && instance.stackCount >= talConfig.maxStack) { - console.warn(`天赋 ${talConfig.name} 已达到最大堆叠次数`); - return; - } - - instance.stackCount++; - instance.lastTriggerLevel = newLevel; - - console.log(`[天赋触发] ${talConfig.name}: 堆叠层数 ${instance.stackCount}`); - this.applyTalentEffect(heroId, talConfig, instance); - } - - // 处理 resetPerLevel 选项 - if ((talConfig.trigger as any).resetPerLevel) { - instance.actionCounter = 0; - instance.damageCounter = 0; - } - }); - } - - /** - * 处理攻击事件 - * @param heroId 英雄ID - * @param damage 造成的伤害值 - */ - public onHeroAttack(heroId: number, damage: number): void { - this.handleActionCounter(heroId, TalActionType.ATTACK); - } - - /** - * 处理技能释放事件 - * @param heroId 英雄ID - * @param skillId 技能ID - */ - public onHeroSkillCast(heroId: number, skillId: number): void { - this.handleActionCounter(heroId, TalActionType.SKILL); - } - - /** - * 处理受伤事件 - * @param heroId 英雄ID - * @param damage 受到的伤害值 - */ - public onHeroDamaged(heroId: number, damage: number): void { - const talentManager = this.talentInstances.get(heroId); - if (!talentManager) return; - - talentManager.talents.forEach((instance, talId) => { - const talConfig = getTalConf(talId); - if (!talConfig || talConfig.talType !== TalType.DAMAGE_COUNT_ATTR) return; - - const damageTrigger = talConfig.trigger as any; - instance.damageCounter++; - - // 检查是否应该触发 - if (instance.damageCounter % damageTrigger.count === 0) { - // 检查是否还能堆叠 - if (talConfig.maxStack && instance.stackCount >= talConfig.maxStack) { - console.warn(`天赋 ${talConfig.name} 已达到最大堆叠次数`); - return; - } - - instance.stackCount++; - console.log(`[天赋触发] ${talConfig.name}: 堆叠层数 ${instance.stackCount}`); - this.applyTalentEffect(heroId, talConfig, instance); - } - }); - } - - /** - * 处理行为计数 - * @private - */ - private handleActionCounter(heroId: number, actionType: TalActionType): void { - const talentManager = this.talentInstances.get(heroId); - if (!talentManager) return; - - talentManager.talents.forEach((instance, talId) => { - const talConfig = getTalConf(talId); - if (!talConfig || talConfig.talType !== TalType.ACTION_COUNT_ATTR) return; - - const actionTrigger = talConfig.trigger as any; - if (actionTrigger.actionType !== actionType) return; - - instance.actionCounter++; - - // 检查是否应该触发 - if (instance.actionCounter % actionTrigger.count === 0) { - // 检查是否还能堆叠 - if (talConfig.maxStack && instance.stackCount >= talConfig.maxStack) { - console.warn(`天赋 ${talConfig.name} 已达到最大堆叠次数`); - return; - } - - instance.stackCount++; - console.log(`[天赋触发] ${talConfig.name}: 堆叠层数 ${instance.stackCount}`); - this.applyTalentEffect(heroId, talConfig, instance); - } - }); - } - - /** - * 应用天赋效果 - * @private - */ - private applyTalentEffect( - heroId: number, - talConfig: ItalConf, - instance: HeroTalentInstance - ): void { - const effect = talConfig.effect; - - switch (effect.type) { - case "attrModify": - this.applyAttrModify(heroId, talConfig); - break; - case "skillTrigger": - this.triggerSkill(heroId, talConfig); - break; - } - } - - /** - * 应用属性修改效果 - * @private - */ - private applyAttrModify(heroId: number, talConfig: ItalConf): void { - const effect = talConfig.effect as any; - const { attr, value, percent } = effect; - - console.log( - `应用属性修改: 英雄${heroId}, 属性${attr}, ` + - `${percent ? '百分比' : '固定值'}: ${value}` - ); - - // 这里应该调用实际的英雄属性修改系统 - // 示例: - // const hero = getHeroData(heroId); - // hero.modifyAttribute(attr, value, percent); - } - - /** - * 触发技能效果 - * @private - */ - private triggerSkill(heroId: number, talConfig: ItalConf): void { - const effect = talConfig.effect as any; - const { skillId } = effect; - - console.log(`自动释放技能: 英雄${heroId}, 技能ID: ${skillId}`); - - // 这里应该调用实际的技能释放系统 - // 示例: - // const hero = getHeroData(heroId); - // hero.castSkill(skillId); - } - - /** - * 获取英雄的天赋实例信息 - */ - public getHeroTalentInfo(heroId: number): HeroTalentManager | undefined { - return this.talentInstances.get(heroId); - } - - /** - * 获取英雄特定天赋的实例数据 - */ - public getHeroTalentInstance( - heroId: number, - talId: number - ): HeroTalentInstance | undefined { - const talentManager = this.talentInstances.get(heroId); - return talentManager?.talents.get(talId); - } -} - -// ========== 天赋查询工具 ========== - -/** - * 天赋查询助手 - */ -export class TalentQueryHelper { - /** - * 获取某类型英雄的所有天赋 - */ - public static getTalentsByType(talType: TalType): ItalConf[] { - return getTalConfByType(talType); - } - - /** - * 获取某属性的所有相关天赋 - */ - public static getTalentsByAttribute(attr: TalAttrType): ItalConf[] { - return Object.values(talConf).filter(tal => { - const effect = tal.effect as any; - return effect.type === "attrModify" && effect.attr === attr; - }); - } - - /** - * 获取基于某行为的所有天赋 - */ - public static getTalentsByAction(actionType: TalActionType): ItalConf[] { - return Object.values(talConf).filter(tal => { - const trigger = tal.trigger as any; - return ( - (trigger.type === "actionCount" && trigger.actionType === actionType) || - (trigger.type === "damageCount") - ); - }); - } - - /** - * 获取所有可堆叠的天赋 - */ - public static getStackableTalents(): ItalConf[] { - return Object.values(talConf).filter(tal => tal.stackable !== false); - } - - /** - * 获取所有技能触发类天赋 - */ - public static getSkillTriggerTalents(): ItalConf[] { - return getTalConfByType(TalType.ACTION_TRIGGER_SKILL); - } - - /** - * 打印所有天赋信息(调试用) - */ - public static printAllTalents(): void { - console.log("========== 所有天赋配置 =========="); - - Object.values(talConf).forEach(tal => { - console.log(`[${tal.talId}] ${tal.name}`); - console.log(` 类型: ${this.getTalTypeString(tal.talType)}`); - console.log(` 描述: ${tal.desc}`); - console.log(` 可堆叠: ${tal.stackable !== false ? "是" : "否"}`); - if (tal.maxStack) { - console.log(` 最大堆叠: ${tal.maxStack}`); - } - }); - } - - /** - * 获取天赋类型的字符串表示 - * @private - */ - private static getTalTypeString(talType: TalType): string { - const typeMap: Record = { - [TalType.LEVEL_ATTR]: "等级属性", - [TalType.ACTION_COUNT_ATTR]: "行为计数属性", - [TalType.DAMAGE_COUNT_ATTR]: "受伤计数属性", - [TalType.ACTION_TRIGGER_SKILL]: "技能触发", - }; - return typeMap[talType] || "未知"; - } -} - -// ========== 使用示例 ========== - -/** - * 示例:初始化和使用天赋系统 - */ -export class TalentSystemExample { - private triggerManager = new TalentTriggerManager(); - - /** - * 示例:初始化英雄刘邦的天赋 - */ - public initLiuBangTalents(): void { - const liuBangId = 5001; - const talentIds = [7001, 7202]; // 剑意提升 + 防御强化 - - console.log("初始化刘邦的天赋系统..."); - this.triggerManager.initHeroTalents(liuBangId, talentIds); - } - - /** - * 示例:模拟刘邦升级流程 - */ - public simulateLevelUp(): void { - const liuBangId = 5001; - - console.log("\n--- 刘邦升级模拟 ---"); - for (let level = 1; level <= 20; level++) { - this.triggerManager.onHeroLevelUp(liuBangId, level); - } - } - - /** - * 示例:模拟战斗中的天赋触发 - */ - public simulateCombat(): void { - const liuBangId = 5001; - - console.log("\n--- 战斗模拟 ---"); - - // 模拟攻击 - for (let i = 0; i < 25; i++) { - this.triggerManager.onHeroAttack(liuBangId, 50); - } - - // 模拟受伤 - for (let i = 0; i < 15; i++) { - this.triggerManager.onHeroDamaged(liuBangId, 30); - } - - // 查询当前天赋状态 - const talentInfo = this.triggerManager.getHeroTalentInfo(liuBangId); - if (talentInfo) { - console.log("\n当前天赋状态:"); - talentInfo.talents.forEach((instance, talId) => { - const talConfig = getTalConf(talId); - console.log( - `${talConfig?.name}: 堆叠 ${instance.stackCount}` + - ` (计数: 行为${instance.actionCounter}, 受伤${instance.damageCounter})` - ); - }); - } - } - - /** - * 示例:查询天赋信息 - */ - public queryTalentInfo(): void { - console.log("\n--- 天赋查询示例 ---"); - - // 查询所有等级类天赋 - const levelTals = TalentQueryHelper.getTalentsByType(TalType.LEVEL_ATTR); - console.log(`\n等级类天赋 (${levelTals.length}个):`); - levelTals.forEach(tal => console.log(` - ${tal.name}`)); - - // 查询与攻击相关的天赋 - const attackTals = TalentQueryHelper.getTalentsByAction(TalActionType.ATTACK); - console.log(`\n与攻击相关的天赋 (${attackTals.length}个):`); - attackTals.forEach(tal => console.log(` - ${tal.name}`)); - - // 查询所有技能触发类天赋 - const skillTals = TalentQueryHelper.getSkillTriggerTalents(); - console.log(`\n技能触发类天赋 (${skillTals.length}个):`); - skillTals.forEach(tal => console.log(` - ${tal.name}`)); - - // 打印所有天赋 - TalentQueryHelper.printAllTalents(); - } -} - -// ========== 全局单例 ========== - -/** 全局天赋触发管理器实例 */ -export const globalTalentManager = new TalentTriggerManager(); - -/** - * 快捷函数:初始化英雄天赋 - */ -export function initHeroTalents(heroId: number, talentIds: number[]): void { - globalTalentManager.initHeroTalents(heroId, talentIds); -} - -/** - * 快捷函数:处理英雄升级 - */ -export function onHeroLevelUp(heroId: number, newLevel: number): void { - globalTalentManager.onHeroLevelUp(heroId, newLevel); -} - -/** - * 快捷函数:处理英雄攻击 - */ -export function onHeroAttack(heroId: number, damage: number): void { - globalTalentManager.onHeroAttack(heroId, damage); -} - -/** - * 快捷函数:处理技能释放 - */ -export function onHeroSkillCast(heroId: number, skillId: number): void { - globalTalentManager.onHeroSkillCast(heroId, skillId); -} - -/** - * 快捷函数:处理英雄受伤 - */ -export function onHeroDamaged(heroId: number, damage: number): void { - globalTalentManager.onHeroDamaged(heroId, damage); -} diff --git a/assets/script/game/common/config/TalSet_QuickRef.md b/assets/script/game/common/config/TalSet_QuickRef.md deleted file mode 100644 index 459c93e0..00000000 --- a/assets/script/game/common/config/TalSet_QuickRef.md +++ /dev/null @@ -1,445 +0,0 @@ -# 天赋系统快速参考 - -## 📋 文件导览 - -| 文件 | 用途 | -|------|------| -| `TalSet.ts` | 核心配置文件 - 定义所有天赋类型、接口和配置表 | -| `TalSet_USAGE.md` | 详细使用文档 - 包含各天赋类型的详解和最佳实践 | -| `TalSet_Example.ts` | 集成示例 - 完整的天赋系统实现代码 | -| `TalSet_QuickRef.md` | 快速参考(本文件) - 常用代码片段速查 | - ---- - -## 🚀 快速开始 - -### 1. 初始化英雄天赋 - -```typescript -import { initHeroTalents } from "./TalSet_Example"; - -// 为英雄 ID=5001 初始化天赋 [7001, 7202] -initHeroTalents(5001, [7001, 7202]); -``` - -### 2. 监听英雄事件 - -```typescript -import { - onHeroLevelUp, - onHeroAttack, - onHeroDamaged -} from "./TalSet_Example"; - -// 英雄升级到新等级 -onHeroLevelUp(5001, 10); - -// 英雄发动攻击 -onHeroAttack(5001, 50); - -// 英雄受到伤害 -onHeroDamaged(5001, 30); -``` - -### 3. 查询天赋信息 - -```typescript -import { getTalConf, getTalConfByType, TalType } from "./TalSet"; - -// 获取单个天赋配置 -const talConfig = getTalConf(7001); - -// 获取某类型的所有天赋 -const levelTals = getTalConfByType(TalType.LEVEL_ATTR); -``` - ---- - -## 📊 天赋类型速查 - -### 等级类天赋 (LEVEL_ATTR) - -**ID范围**: 7001-7099 - -| ID | 名称 | 描述 | 触发条件 | -|---|------|------|--------| -| 7001 | 剑意提升 | 攻击力 +10% | 每5级 | -| 7002 | 法力修炼 | 魔力 +15 | 每3级 | - -**配置模板**: -```typescript -{ - talId: 7001, - name: "天赋名", - desc: "效果描述", - talType: TalType.LEVEL_ATTR, - trigger: { type: "level", level: 5 } as ILevelTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.AP, - value: 10, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, -} -``` - ---- - -### 行为计数类天赋 (ACTION_COUNT_ATTR) - -**ID范围**: 7101-7199 - -| ID | 名称 | 描述 | 触发条件 | -|---|------|------|--------| -| 7101 | 强化闪避 | 闪避率 +1% | 每10次攻击 | -| 7102 | 暴击强化 | 暴击率 +2% | 每15次攻击 | -| 7103 | 连击精通 | 攻击力 +5% | 每8次技能 | - -**配置模板**: -```typescript -{ - talId: 7101, - name: "天赋名", - desc: "效果描述", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 10, - resetPerLevel: false, - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.DODGE, - value: 1, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, -} -``` - -**行为类型**: -- `TalActionType.ATTACK` - 攻击 -- `TalActionType.SKILL` - 技能 -- `TalActionType.DAMAGED` - 受伤 - ---- - -### 受伤计数类天赋 (DAMAGE_COUNT_ATTR) - -**ID范围**: 7201-7299 - -| ID | 名称 | 描述 | 触发条件 | -|---|------|------|--------| -| 7201 | 坚甲护体 | 生命 +100 | 每10次受伤 | -| 7202 | 防御强化 | 防御 +3% | 每12次受伤 | -| 7203 | 魔抗修炼 | 魔防 +5 | 每15次受伤 | - -**配置模板**: -```typescript -{ - talId: 7201, - name: "天赋名", - desc: "效果描述", - talType: TalType.DAMAGE_COUNT_ATTR, - trigger: { - type: "damageCount", - count: 10, - resetPerLevel: false, - } as IDamageCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.HP, - value: 100, - percent: false, - } as IAttrModifyEffect, - stackable: true, - maxStack: 15, -} -``` - ---- - -### 技能触发类天赋 (ACTION_TRIGGER_SKILL) - -**ID范围**: 7301-7399 - -| ID | 名称 | 描述 | 触发条件 | -|---|------|------|--------| -| 7301 | 连击反击 | 释放技能6010 | 每15次攻击 | -| 7302 | 受伤反制 | 释放技能6011 | 每8次受伤 | -| 7303 | 技能链接 | 释放技能6012 | 每5次技能 | - -**配置模板**: -```typescript -{ - talId: 7301, - name: "天赋名", - desc: "效果描述", - talType: TalType.ACTION_TRIGGER_SKILL, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 15, - resetPerLevel: true, - } as IActionCountTrigger, - effect: { - type: "skillTrigger", - skillId: 6010, - } as ISkillTriggerEffect, - stackable: false, -} -``` - ---- - -## 🎯 属性类型速查 - -```typescript -TalAttrType.HP // 最大生命值 -TalAttrType.MP // 最大魔力值 -TalAttrType.AP // 攻击力 -TalAttrType.MAP // 魔法攻击力 -TalAttrType.DEF // 防御力 -TalAttrType.MDEF // 魔法防御力 -TalAttrType.SPEED // 移动速度 -TalAttrType.DODGE // 闪避率 -TalAttrType.CRIT // 暴击率 -``` - ---- - -## 💡 常见代码片段 - -### 获取所有某类型天赋 - -```typescript -import { getTalConfByType, TalType } from "./TalSet"; - -const levelTals = getTalConfByType(TalType.LEVEL_ATTR); -const actionTals = getTalConfByType(TalType.ACTION_COUNT_ATTR); -const damageTals = getTalConfByType(TalType.DAMAGE_COUNT_ATTR); -const skillTals = getTalConfByType(TalType.ACTION_TRIGGER_SKILL); -``` - -### 获取某属性相关的所有天赋 - -```typescript -import { TalentQueryHelper, TalAttrType } from "./TalSet_Example"; - -const hpTals = TalentQueryHelper.getTalentsByAttribute(TalAttrType.HP); -const apTals = TalentQueryHelper.getTalentsByAttribute(TalAttrType.AP); -``` - -### 获取某行为相关的所有天赋 - -```typescript -import { TalentQueryHelper, TalActionType } from "./TalSet_Example"; - -const attackTals = TalentQueryHelper.getTalentsByAction(TalActionType.ATTACK); -const skillTals = TalentQueryHelper.getTalentsByAction(TalActionType.SKILL); -``` - -### 获取英雄的天赋状态 - -```typescript -import { globalTalentManager } from "./TalSet_Example"; - -const talentInfo = globalTalentManager.getHeroTalentInfo(5001); -if (talentInfo) { - talentInfo.talents.forEach((instance, talId) => { - console.log(`天赋${talId}: 堆叠${instance.stackCount}`); - }); -} -``` - -### 获取英雄的特定天赋实例 - -```typescript -import { globalTalentManager } from "./TalSet_Example"; - -const talInstance = globalTalentManager.getHeroTalentInstance(5001, 7001); -if (talInstance) { - console.log(`堆叠层数: ${talInstance.stackCount}`); - console.log(`行为计数: ${talInstance.actionCounter}`); - console.log(`受伤计数: ${talInstance.damageCounter}`); -} -``` - ---- - -## 📝 添加新天赋步骤 - -### 步骤 1: 确定天赋类型 - -选择以下之一: -- `LEVEL_ATTR` - 等级触发 -- `ACTION_COUNT_ATTR` - 行为计数触发 -- `DAMAGE_COUNT_ATTR` - 受伤次数触发 -- `ACTION_TRIGGER_SKILL` - 技能自动释放 - -### 步骤 2: 分配 ID - -遵循命名规范: -- `70xx` - 等级类 -- `71xx` - 行为计数类 -- `72xx` - 受伤计数类 -- `73xx` - 技能触发类 - -### 步骤 3: 配置天赋 - -在 `TalSet.ts` 的 `talConf` 中添加配置: - -```typescript -// 示例:新增"生命吸取"天赋 -7104: { - talId: 7104, - name: "生命吸取", - desc: "每使用技能10次,最大生命值增加50点", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.SKILL, - count: 10, - resetPerLevel: false, - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.HP, - value: 50, - percent: false, - } as IAttrModifyEffect, - stackable: true, - maxStack: 10, -}, -``` - ---- - -## 🔍 调试技巧 - -### 打印所有天赋信息 - -```typescript -import { TalentQueryHelper } from "./TalSet_Example"; - -TalentQueryHelper.printAllTalents(); -``` - -### 获取所有天赋ID - -```typescript -import { getAllTalIds } from "./TalSet"; - -const allIds = getAllTalIds(); -console.log(allIds); // [7001, 7002, 7101, ...] -``` - -### 获取所有可堆叠天赋 - -```typescript -import { TalentQueryHelper } from "./TalSet_Example"; - -const stackableTals = TalentQueryHelper.getStackableTalents(); -``` - -### 获取所有技能触发类天赋 - -```typescript -import { TalentQueryHelper } from "./TalSet_Example"; - -const skillTriggerTals = TalentQueryHelper.getSkillTriggerTalents(); -``` - ---- - -## ⚙️ 配置最佳实践 - -### 等级间隔建议 - -| 间隔 | 用途 | 示例 | -|------|------|------| -| 1 级 | 极高频触发(谨慎使用) | 特殊被动 | -| 2-3 级 | 高频触发 | 关键属性增长 | -| 4-5 级 | 常规触发 | 通用属性增长 | -| 6-10 级 | 低频触发 | 强力效果 | - -### 堆叠层数建议 - -| 效果类型 | 建议上限 | 原因 | -|---------|---------|------| -| 固定值 (+100 HP) | 10-20 | 总收益 1000-2000 | -| 小百分比 (+1%) | 15-30 | 防止过度膨胀 | -| 大百分比 (+5%) | 5-10 | 数值平衡 | -| 技能触发 | 1 (false) | 防止无限触发 | - -### 数值平衡公式 - -``` -最终增益 = 基础值 × 最大堆叠 × 触发频率 - -例: 攻击力 +10% × 20 堆叠 = 200% 增加 - 调整建议: 减少堆叠 maxStack 或增加触发频率 -``` - ---- - -## 📦 导入速览 - -### 基础导入 - -```typescript -import { - TalType, // 天赋类型枚举 - TalAttrType, // 属性类型枚举 - TalActionType, // 行为类型枚举 - getTalConf, // 获取单个天赋 - getTalConfByType, // 按类型获取天赋 - getAllTalIds, // 获取所有天赋ID -} from "./TalSet"; -``` - -### 高级导入 - -```typescript -import { - TalentTriggerManager, // 天赋触发管理器 - TalentQueryHelper, // 天赋查询助手 - globalTalentManager, // 全局管理器实例 - initHeroTalents, // 初始化天赋 - onHeroLevelUp, // 升级事件 - onHeroAttack, // 攻击事件 - onHeroSkillCast, // 技能事件 - onHeroDamaged, // 受伤事件 -} from "./TalSet_Example"; -``` - ---- - -## 🐛 常见问题速答 - -| 问题 | 答案 | -|------|------| -| 如何禁用某个天赋? | 在初始化时不添加该天赋ID | -| 天赋可以堆叠多少次? | 看 `maxStack` 配置,不设则无限 | -| 如何重置计数器? | 设置 `resetPerLevel: true` 按等级重置 | -| 如何添加新的属性类型? | 在 `TalAttrType` 枚举中添加 | -| 如何添加新的行为类型? | 在 `TalActionType` 枚举中添加 | -| 技能触发如何防止无限循环? | 设置 `stackable: false` | - ---- - -## 📚 相关文件链接 - -- [详细使用文档](./TalSet_USAGE.md) - 完整的天赋系统说明 -- [集成示例代码](./TalSet_Example.ts) - 天赋系统实现示例 -- [核心配置文件](./TalSet.ts) - 所有类型定义和配置表 - ---- - -**版本**: 1.0 -**最后更新**: 2025-10-27 -**维护者**: 开发团队 diff --git a/assets/script/game/common/config/TalSet_README.md b/assets/script/game/common/config/TalSet_README.md deleted file mode 100644 index 959f69d1..00000000 --- a/assets/script/game/common/config/TalSet_README.md +++ /dev/null @@ -1,532 +0,0 @@ -# 🎮 英雄天赋系统 (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 | -| 扩展性评分 | ⭐⭐⭐⭐⭐ | diff --git a/assets/script/game/common/config/TalSet_USAGE.md b/assets/script/game/common/config/TalSet_USAGE.md deleted file mode 100644 index 2d675eb9..00000000 --- a/assets/script/game/common/config/TalSet_USAGE.md +++ /dev/null @@ -1,454 +0,0 @@ -# 天赋系统配置文档 - -## 概述 - -`TalSet.ts` 定义了一个灵活、可扩展的天赋系统,用于为游戏中的英雄定义特殊能力或特性。该系统支持四种主要的天赋类型,每种类型都有其独特的触发条件和效果机制。 - -## 核心概念 - -### 天赋系统的三个层次 - -1. **触发条件 (Trigger)** - 何时激发天赋效果 -2. **效果 (Effect)** - 天赋产生的具体效果 -3. **堆叠规则 (Stack Rules)** - 多次触发时的行为 - ---- - -## 四种天赋类型详解 - -### 1. 等级类天赋 (LEVEL_ATTR) - -**触发机制**:当英雄达到指定等级时触发 - -**使用场景**: -- 角色成长里程碑 -- 等级解锁的被动能力 -- 固定间隔的属性增强 - -**配置示例**: -```typescript -7001: { - talId: 7001, - name: "剑意提升", - desc: "每升5级,攻击力增加10%", - talType: TalType.LEVEL_ATTR, - trigger: { - type: "level", - level: 5, // 触发间隔为5级 - } as ILevelTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.AP, - value: 10, - percent: true, // 百分比增长 - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, // 最多触发20次(到100级) -} -``` - -**工作流程**: -- 等级 5 → 触发,攻击力 +10% -- 等级 10 → 再次触发,攻击力 +10%(可堆叠) -- 等级 15 → 继续触发... -- 最高到等级 100(20×5) - ---- - -### 2. 行为计数类天赋 (ACTION_COUNT_ATTR) - -**触发机制**:当特定行为累计达到指定次数时触发 - -**支持的行为类型**: -- `ATTACK` - 攻击动作 -- `SKILL` - 技能释放 -- `DAMAGED` - 受到伤害 - -**配置示例**: -```typescript -7101: { - talId: 7101, - name: "强化闪避", - desc: "每攻击10次,闪避率增加1%", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 10, - resetPerLevel: false, // 升级后不重置计数 - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.DODGE, - value: 1, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 20, -} -``` - -**工作流程**(假设 resetPerLevel: false): -- 攻击 10 次 → 闪避率 +1% -- 攻击 20 次 → 闪避率 +1%(累计 +2%) -- 攻击 30 次 → 闪避率 +1%(累计 +3%) -- 持续堆叠到 maxStack - -**resetPerLevel 选项说明**: -- `true`:每升一级重置计数器 - - 适合每个等级独立计算的天赋 - - 示例:每升级后重新开始计数 -- `false`:计数持续累积,不因升级而重置 - - 适合全程累积的天赋 - - 示例:整个游戏过程中累积攻击次数 - ---- - -### 3. 受伤计数类天赋 (DAMAGE_COUNT_ATTR) - -**触发机制**:当英雄累计受伤达到指定次数时触发 - -**配置示例**: -```typescript -7201: { - talId: 7201, - name: "坚甲护体", - desc: "每受伤10次,最大生命值增加100点", - talType: TalType.DAMAGE_COUNT_ATTR, - trigger: { - type: "damageCount", - count: 10, - resetPerLevel: false, - } as IDamageCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.HP, - value: 100, - percent: false, // 固定值增长 - } as IAttrModifyEffect, - stackable: true, - maxStack: 15, -} -``` - -**工作流程**: -- 受伤 10 次 → 生命值 +100 -- 受伤 20 次 → 生命值 +100 -- 受伤 30 次 → 生命值 +100 -- ...最多到 15 堆叠(150 次受伤) - -**应用场景**: -- 坦克英雄通过受伤变强 -- 防御系统的成长机制 -- 反伤/反制类的天赋基础 - ---- - -### 4. 技能触发类天赋 (ACTION_TRIGGER_SKILL) - -**触发机制**:当特定条件达成时自动释放指定的技能 - -**配置示例**: -```typescript -7301: { - talId: 7301, - name: "连击反击", - desc: "每攻击15次,自动触发反击技能", - talType: TalType.ACTION_TRIGGER_SKILL, - trigger: { - type: "actionCount", - actionType: TalActionType.ATTACK, - count: 15, - resetPerLevel: true, // 每升级重置计数 - } as IActionCountTrigger, - effect: { - type: "skillTrigger", - skillId: 6010, // 反击技能的ID - } as ISkillTriggerEffect, - stackable: false, // 技能触发不堆叠 -} -``` - -**工作流程**: -- 升级 1:每攻击 15 次 → 自动释放技能 6010 -- 升级 2:计数重置,再每攻击 15 次 → 释放技能 6010 -- 持续每个等级都能触发 - -**关键特性**: -- `stackable: false` - 通常技能触发不堆叠(防止过于强大) -- 结合 `resetPerLevel` 控制触发频率 -- 可用于创建连锁反应和特殊战斗机制 - ---- - -## 属性类型速查表 - -| 属性类型 | 枚举值 | 说明 | -|---------|-------|------| -| HP | "hp" | 最大生命值 | -| MP | "mp" | 最大魔力值 | -| AP | "ap" | 攻击力 | -| MAP | "map" | 魔法攻击力 | -| DEF | "def" | 防御力 | -| MDEF | "mdef" | 魔法防御力 | -| SPEED | "speed" | 移动速度 | -| DODGE | "dodge" | 闪避率 | -| CRIT | "crit" | 暴击率 | - ---- - -## 扩展天赋系统 - -### 添加新的等级类天赋 - -```typescript -/** - * 坚韧意志 - 全系列 - * 每升4级,防御力增加5% - */ -7003: { - talId: 7003, - name: "坚韧意志", - desc: "每升4级,防御力增加5%", - talType: TalType.LEVEL_ATTR, - trigger: { - type: "level", - level: 4, - } as ILevelTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.DEF, - value: 5, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 25, -}, -``` - -### 添加新的行为计数类天赋 - -```typescript -/** - * 技能精通 - 法师系 - * 每使用技能12次,魔法攻击增加8% - */ -7104: { - talId: 7104, - name: "技能精通", - desc: "每使用技能12次,魔法攻击增加8%", - talType: TalType.ACTION_COUNT_ATTR, - trigger: { - type: "actionCount", - actionType: TalActionType.SKILL, - count: 12, - resetPerLevel: false, - } as IActionCountTrigger, - effect: { - type: "attrModify", - attr: TalAttrType.MAP, - value: 8, - percent: true, - } as IAttrModifyEffect, - stackable: true, - maxStack: 12, -}, -``` - -### 添加新的受伤计数类天赋 - -```typescript -/** - * 越战越强 - 战士系 - * 每受伤8次,攻击力增加4% - */ -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, -}, -``` - -### 添加新的技能触发类天赋 - -```typescript -/** - * 治疗链 - 辅助系 - * 每使用技能6次,自动释放治疗技能 - */ -7304: { - talId: 7304, - name: "治疗链", - desc: "每使用技能6次,自动释放治疗技能", - talType: TalType.ACTION_TRIGGER_SKILL, - trigger: { - type: "actionCount", - actionType: TalActionType.SKILL, - count: 6, - resetPerLevel: true, - } as IActionCountTrigger, - effect: { - type: "skillTrigger", - skillId: 6020, // 治疗技能ID - } as ISkillTriggerEffect, - stackable: false, -}, -``` - ---- - -## 使用工具函数 - -### 1. 获取单个天赋配置 - -```typescript -import { getTalConf } from "./TalSet"; - -const talConfig = getTalConf(7001); -console.log(talConfig?.name); // "剑意提升" -``` - -### 2. 获取指定类型的所有天赋 - -```typescript -import { getTalConfByType, TalType } from "./TalSet"; - -// 获取所有等级类天赋 -const levelTals = getTalConfByType(TalType.LEVEL_ATTR); - -// 获取所有行为计数类天赋 -const actionCountTals = getTalConfByType(TalType.ACTION_COUNT_ATTR); -``` - -### 3. 获取所有天赋ID - -```typescript -import { getAllTalIds } from "./TalSet"; - -const allIds = getAllTalIds(); -console.log(allIds); // [7001, 7002, 7101, 7102, ...] -``` - ---- - -## 最佳实践 - -### 1. ID 命名规范 - -采用 **XYZZ** 的格式: -- **X** - 天赋类型(7表示天赋) -- **Y** - 具体分类(0=等级,1=行为计数,2=受伤计数,3=技能触发) -- **ZZ** - 序列号(01-99) - -示例: -- `7001` - 第一个等级类天赋 -- `7101` - 第一个行为计数类天赋 -- `7201` - 第一个受伤计数类天赋 -- `7301` - 第一个技能触发类天赋 - -### 2. 堆叠配置原则 - -- **属性增强类天赋** - 通常可堆叠,设置合理的 maxStack -- **技能触发类天赋** - 通常不堆叠(stackable: false) -- **百分比效果** - 堆叠次数要控制,防止无限膨胀 - -### 3. 触发计数的重置策略 - -- **持续累积** - resetPerLevel: false - - 用于全程成长的天赋 - - 例如:攻击次数计数 - -- **按等级重置** - resetPerLevel: true - - 用于每个等级独立计算的天赋 - - 例如:技能连锁、特殊触发 - -### 4. 数值平衡 - -建议遵循以下原则: -- 固定值增长 - 根据角色等级调整数值 -- 百分比增长 - 通常 1-15% 范围较合理 -- 触发频率 - 越高频越小效果,越低频越大效果 - ---- - -## 与英雄系统的集成 - -### 在 heroSet.ts 中添加天赋 - -```typescript -export interface heroInfo { - uuid: number; - name: string; - // ... 其他属性 ... - talents?: number[]; // 天赋ID数组 -} - -// 示例:为刘邦添加天赋 -5001: { - uuid: 5001, - name: "刘邦", - // ... 其他属性 ... - talents: [7001, 7202], // 剑意提升 + 防御强化 -} -``` - -### 在游戏系统中使用天赋 - -```typescript -import { getTalConf, TalType } from "./TalSet"; - -// 为英雄应用天赋 -function applyHeroTalents(heroId: number, heroTalents: number[]) { - heroTalents.forEach(talId => { - const talConfig = getTalConf(talId); - if (talConfig) { - // 根据天赋配置应用效果 - console.log(`应用天赋: ${talConfig.name}`); - } - }); -} -``` - ---- - -## 常见问题 - -### Q: 如何创建一个多条件触发的天赋? -**A**: 当前系统每个天赋只支持一种触发条件。如需复杂条件,建议在实现层面组合多个简单天赋。 - -### Q: 堆叠次数达到上限后会发生什么? -**A**: 这由实现层面决定。建议: -- 停止触发 -- 显示通知提示 -- 或记录日志便于调试 - -### Q: 如何实现基于时间的天赋触发? -**A**: 当前系统不直接支持时间触发。建议: -- 创建一个新的触发条件类型 `ITimeTrigger` -- 在系统中添加相应的时间检查逻辑 - -### Q: 如何让天赋在战斗中实时反应? -**A**: 天赋的实际效果应该在战斗系统中实现,配置只是定义。建议: -- 在战斗系统中监听相关事件 -- 检查英雄的天赋配置 -- 根据配置应用对应的效果 - ---- - -## 总结 - -`TalSet.ts` 提供了一个强大而灵活的天赋系统框架,支持多种触发条件和效果类型。通过合理的配置和组合,可以创建出丰富多样的英雄特性,为游戏增添深度和可玩性。 diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 62f18d60..482cbcec 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -93,7 +93,7 @@ export enum HeroUpSet { export interface heroInfo{ uuid:number, name:string, path:string,fac:FacSet,kind:number,type:HType, hp:number,mp:number, ap:number,map:number, def:number,mdef:number,dis:number, speed:number,lv:number,skills:number[], - buff:BuffConf[], info:string + buff:BuffConf[], tal:number[], info:string } export const HeroInfo: Record = { @@ -101,52 +101,54 @@ export const HeroInfo: Record = { // 刘邦 - 领导型战士(善于用人,知人善任) 5001:{uuid:5001,name:"刘邦",path:"hk1", fac:FacSet.HERO, kind:1, - type:HType.warrior,lv:1,hp:120,mp:80,map:10,def:8,mdef:0,ap:15,dis:100,speed:120,skills:[6001,6005], - buff:[],info:"汉朝开国皇帝,善于用人,领导型战士"}, + type:HType.warrior,lv:1,hp:125,mp:85,map:10,def:9,mdef:0,ap:15,dis:100,speed:120,skills:[6001,6005], + buff:[],tal:[],info:"楚汉争霸领袖,领导统御型战士"}, // 荆轲 - 刺客(敏捷型,高速度和暴击率) 5002:{uuid:5002,name:"荆轲",path:"hc1", fac:FacSet.HERO, kind:1, - type:HType.assassin,lv:1,hp:80,mp:60,map:5,def:3,mdef:0,ap:20,dis:120,speed:180,skills:[6001,6005], - buff:[],info:"战国刺客,高速度高暴击的敏捷型刺客"}, + type:HType.assassin,lv:1,hp:80,mp:60,map:5,def:3,mdef:0,ap:22,dis:120,speed:180,skills:[6001,6005], + buff:[],tal:[],info:"战国刺客,刺杀专精敏捷型刺客"}, - // 绿箭 - 远程射手(机动型,高移动速度和远程攻击) - 5005:{uuid:5005,name:"绿箭",path:"ha1", fac:FacSet.HERO, kind:2, - type:HType.remote,lv:1,hp:90,mp:70,map:8,def:4,mdef:0,ap:18,dis:450,speed:140,skills:[6001,6005], - buff:[],info:"远程射手,机动型高远程输出"}, + // 赵武灵王 - 远程射手(胡服骑射,机动型高移动速度和远程攻击) + 5005:{uuid:5005,name:"赵武灵王",path:"ha1", fac:FacSet.HERO, kind:2, + type:HType.remote,lv:1,hp:100,mp:80,map:8,def:6,mdef:0,ap:18,dis:450,speed:140,skills:[6001,6005], + buff:[],tal:[],info:"胡服骑射改革者,机动型高远程输出"}, - // 牧师 - 辅助治疗(辅助型,擅长治疗和支援) - 5007:{uuid:5007,name:"牧师",path:"hh1", fac:FacSet.HERO, kind:2, - type:HType.support,lv:1,hp:100,mp:120,map:12,def:5,mdef:0,ap:8,dis:350,speed:100,skills:[6001,6005], - buff:[],info:"辅助治疗者,擅长治疗和支援队友"}, + // 张良 - 智谋法师(运筹帷幄,智谋型法师) + 5007:{uuid:5007,name:"张良",path:"hh1", fac:FacSet.HERO, kind:2, + type:HType.mage,lv:1,hp:88,mp:135,map:12,def:5,mdef:0,ap:15,dis:350,speed:100,skills:[6001,6005], + buff:[],tal:[],info:"运筹帷幄谋士,智谋型法师"}, - // 火女 - 元素法师(元素型,操控火焰元素) - 5008:{uuid:5008,name:"火女",path:"hm1", fac:FacSet.HERO, kind:2, - type:HType.mage,lv:1,hp:85,mp:150,map:25,def:3,mdef:0,ap:6,dis:400,speed:90,skills:[6001,6005], - buff:[],info:"元素法师,操控火焰元素进行高魔法输出"}, + // 屈原 - 元素法师(离骚诗韵,元素型高魔法输出) + 5008:{uuid:5008,name:"屈原",path:"hm1", fac:FacSet.HERO, kind:2, + type:HType.mage,lv:1,hp:85,mp:140,map:25,def:4,mdef:0,ap:16,dis:400,speed:90,skills:[6001,6005], + buff:[],tal:[],info:"离骚诗韵,元素型高魔法输出"}, - // 魔法精灵 - 奥术法师(博学型,掌握多种魔法) - 5009:{uuid:5009,name:"魔法精灵",path:"hm2", fac:FacSet.HERO, kind:2, - type:HType.mage,lv:1,hp:80,mp:160,map:28,def:2,mdef:0,ap:5,dis:420,speed:95,skills:[6001,6005], - buff:[],info:"奥术法师,博学多才掌握多种魔法"}, + // 孙膑 - 谋略法师(兵法谋略,谋略型法师) + 5009:{uuid:5009,name:"孙膑",path:"hm2", fac:FacSet.HERO, kind:2, + type:HType.mage,lv:1,hp:92,mp:135,map:28,def:6,mdef:0,ap:14,dis:420,speed:95,skills:[6001,6005], + buff:[],tal:[],info:"兵法谋略,谋略型法师"}, - // 德鲁伊 - 自然辅助(辅助型,自然魔法和召唤) - 5010:{uuid:5010,name:"德鲁伊",path:"hz1", fac:FacSet.HERO, kind:2, - type:HType.support,lv:1,hp:95,mp:130,map:18,def:6,mdef:0,ap:10,dis:380,speed:105,skills:[6001,6005], - buff:[],info:"自然德鲁伊,精通自然魔法和生命治愈"}, + // 萧何 - 后勤辅助(后勤保障,后勤型辅助) + 5010:{uuid:5010,name:"萧何",path:"hz1", fac:FacSet.HERO, kind:2, + type:HType.support,lv:1,hp:115,mp:145,map:18,def:10,mdef:0,ap:8,dis:380,speed:105,skills:[6001,6005], + buff:[],tal:[],info:"后勤保障,后勤型辅助"}, + + //怪物 5201:{uuid:5201,name:"兽人战士",path:"mo1", fac:FacSet.MON, kind:1, type:HType.warrior,lv:1,hp:25,mp:100,map:10,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005], - buff:[],info:"普通怪物-战士型"}, + buff:[],tal:[],info:"普通怪物-战士型"}, 5202:{uuid:5202,name:"兽人刺客",path:"mo1", fac:FacSet.MON, kind:1, type:HType.remote,lv:1,hp:20,mp:100,map:10,def:5,mdef:0,ap:5,dis:350,speed:100,skills:[6005], - buff:[],info:"普通怪物-战士型"}, + buff:[],tal:[],info:"普通怪物-战士型"}, 5203:{uuid:5203,name:"兽人护卫",path:"mo1", fac:FacSet.MON, kind:1, type:HType.warrior,lv:1,hp:25,mp:100,map:10,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005], - buff:[],info:"普通怪物-战士型"}, + buff:[],tal:[],info:"普通怪物-战士型"}, }; \ No newline at end of file