diff --git a/assets/script/game/common/CardIconHelper.ts b/assets/script/game/common/CardIconHelper.ts index 6e9b2b4a..8eeae384 100644 --- a/assets/script/game/common/CardIconHelper.ts +++ b/assets/script/game/common/CardIconHelper.ts @@ -30,7 +30,7 @@ export function getCardIconId(cardData: CardConfig | null): string { // 2. 装备卡:取第一个 field 词条图标 if (cardData.field && cardData.field.length > 0) { - const fieldUuid = cardData.field[0]; + const fieldUuid = cardData.field[0].uuid; return FieldSkillSet[fieldUuid]?.icon || `${fieldUuid}`; } diff --git a/assets/script/game/common/config/CardSet.ts b/assets/script/game/common/config/CardSet.ts index 3f3dd603..0437e369 100644 --- a/assets/script/game/common/config/CardSet.ts +++ b/assets/script/game/common/config/CardSet.ts @@ -1,5 +1,5 @@ import * as exp from "constants" -import { HeroInfo, HeroList, HType } from "./heroSet" +import { HeroInfo, HeroList, HType, FieldEntry } from "./heroSet" import { oops } from "db://oops-framework/core/Oops" import { SkillOverrides, TGroup } from "./SkillSet" @@ -73,7 +73,7 @@ export interface CardConfig { t_inv?: number // 触发间隔(秒) keep_waves?: number // 维持的回合数(-1表示持续到战斗结束,0或undefined表示仅本回合) overrides?: SkillOverrides // 技能参数覆写(如自定义伤害ap、buff值、金币数等) - field?: number[] // 装备词条数组:驻场光环卡(trigger_type=Field)的属性词条,支持单卡多词条(如 [7002, 7004, 7005] 同时提供攻击/暴击/暴伤) + field?: FieldEntry[] // 装备词条数组:驻场光环卡(trigger_type=Field)的属性词条,支持单卡多词条;value 为实际生效数值(如 [{uuid:7002,value:0.1},{uuid:7004,value:0.1}] 同时提供攻击/暴击) /** 触发类型(必填,技能卡专用;功能卡/英雄卡可缺省) */ trigger_type?: CardTriggerType; diff --git a/assets/script/game/common/config/EquipSet.ts b/assets/script/game/common/config/EquipSet.ts index 3c9f180c..7070b1bb 100644 --- a/assets/script/game/common/config/EquipSet.ts +++ b/assets/script/game/common/config/EquipSet.ts @@ -15,6 +15,7 @@ * - FieldSkillSet(SkillSet)—— 属性词条配置 */ import { CardConfig, CardType, CKind, CardTriggerType } from "./CardSet"; +import { FieldEntry } from "./heroSet"; /** 装备卡原始数据(仅装备相关字段,由 EquipSet 内部转换为 CardConfig) */ interface EquipRawData { @@ -23,66 +24,66 @@ interface EquipRawData { name: string; info: string; icon?: string; // 图标ID(对应 ui6 图集 frame 名) - field: number[]; + field: FieldEntry[]; // 驻场光环词条:uuid 指向 FieldSkillSet 底座,value 为实际生效数值 cost?: number; } /** 装备卡原始数据表 */ const EquipRawList: EquipRawData[] = [ // ==================== card_lv 1 档(基础强度) ==================== - { uuid: 8701, card_lv: 1, icon: "Helmet-FA_Helmet_021_Gray", name: "战后恢复", info: "战斗结束生命回复量+10%", field: [7001] }, - { uuid: 8702, card_lv: 1, icon: "Sword-FA_WP_Main_Sword_003_GrayGold", name: "攻击加成", info: "全体攻击力+10%", field: [7002] }, - { uuid: 8703, card_lv: 1, icon: "Blunt-FA_WP_Main_Blunt_002_Wood", name: "击晕加成", info: "全体击晕概率+10%", field: [7003] }, - { uuid: 8704, card_lv: 1, icon: "Axe-FA_WP_Main_Axe_001_WoodGray", name: "暴击加成", info: "全体暴击率+10%", field: [7004] }, - { uuid: 8705, card_lv: 1, icon: "Bow-FA_WP_Main_Bow_003_WoodGreen", name: "暴伤加成", info: "全体暴击伤害+20%", field: [7005] }, - { uuid: 8706, card_lv: 1, icon: "Crossbow-FA_WP_Main_Crossbow_001_WoodWhite", name: "攻速加成", info: "全体攻击速度+10%", field: [7006] }, - { uuid: 8707, card_lv: 1, icon: "Chest-FA_Chest_014_Gray", name: "生命加成", info: "全体最大生命+10%", field: [7007] }, - { uuid: 8708, card_lv: 1, icon: "Wand-FA_WP_Main_Wand_001_GrayGreen", name: "风怒加成", info: "全体风怒概率+10%", field: [7008] }, - { uuid: 8709, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "穿刺加成", info: "全体穿刺概率+10%", field: [7009] }, - { uuid: 8712, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "破甲加成", info: "全体穿透后伤害+10%", field: [7020] }, - { uuid: 8710, card_lv: 1, icon: "Shield-FA_WP_Sub_Shield_007_GoldGray", name: "金币收益", info: "每回合金币收益+1", field: [7010] }, - { uuid: 8711, card_lv: 1, icon: "Staff-FA_WP_Main_Staff_003_WoodSkyblue", name: "出售强化", info: "卖出英雄金币+1", field: [7011] }, + { uuid: 8701, card_lv: 1, icon: "Helmet-FA_Helmet_021_Gray", name: "战后恢复", info: "战斗结束生命回复量+10%", field: [{ uuid: 7001, value: 0.1 }] }, + { uuid: 8702, card_lv: 1, icon: "Sword-FA_WP_Main_Sword_003_GrayGold", name: "攻击加成", info: "全体攻击力+10%", field: [{ uuid: 7002, value: 0.1 }] }, + { uuid: 8703, card_lv: 1, icon: "Blunt-FA_WP_Main_Blunt_002_Wood", name: "击晕加成", info: "全体击晕概率+10%", field: [{ uuid: 7003, value: 0.1 }] }, + { uuid: 8704, card_lv: 1, icon: "Axe-FA_WP_Main_Axe_001_WoodGray", name: "暴击加成", info: "全体暴击率+10%", field: [{ uuid: 7004, value: 0.1 }] }, + { uuid: 8705, card_lv: 1, icon: "Bow-FA_WP_Main_Bow_003_WoodGreen", name: "暴伤加成", info: "全体暴击伤害+20%", field: [{ uuid: 7005, value: 0.2 }] }, + { uuid: 8706, card_lv: 1, icon: "Crossbow-FA_WP_Main_Crossbow_001_WoodWhite", name: "攻速加成", info: "全体攻击速度+10%", field: [{ uuid: 7006, value: 0.1 }] }, + { uuid: 8707, card_lv: 1, icon: "Chest-FA_Chest_014_Gray", name: "生命加成", info: "全体最大生命+10%", field: [{ uuid: 7007, value: 0.1 }] }, + { uuid: 8708, card_lv: 1, icon: "Wand-FA_WP_Main_Wand_001_GrayGreen", name: "风怒加成", info: "全体风怒概率+10%", field: [{ uuid: 7008, value: 0.1 }] }, + { uuid: 8709, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "穿刺加成", info: "全体穿刺概率+10%", field: [{ uuid: 7009, value: 0.1 }] }, + { uuid: 8712, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "破甲加成", info: "全体穿透后伤害+10%", field: [{ uuid: 7020, value: 0.1 }] }, + { uuid: 8710, card_lv: 1, icon: "Shield-FA_WP_Sub_Shield_007_GoldGray", name: "金币收益", info: "每回合金币收益+1", field: [{ uuid: 7010, value: 1 }] }, + { uuid: 8711, card_lv: 1, icon: "Staff-FA_WP_Main_Staff_003_WoodSkyblue", name: "出售强化", info: "卖出英雄金币+1", field: [{ uuid: 7011, value: 1 }] }, // 多词条装备 - { uuid: 8720, card_lv: 1, icon: "Shield-FA_WP_Sub_Shield_007_GoldGray", name: "勇者护符", info: "全体攻击力+10%, 暴击率+10%, 暴击伤害+20%", field: [7002, 7004, 7005] }, + { uuid: 8720, card_lv: 1, icon: "Shield-FA_WP_Sub_Shield_007_GoldGray", name: "勇者护符", info: "全体攻击力+10%, 暴击率+10%, 暴击伤害+20%", field: [{ uuid: 7002, value: 0.1 }, { uuid: 7004, value: 0.1 }, { uuid: 7005, value: 0.2 }] }, // ==================== card_lv 2 档(强度 ×2) ==================== - { uuid: 8751, card_lv: 2, icon: "Helmet-FA_Helmet_022_DarkBlue", name: "战后恢复", info: "战斗结束生命回复量+20%", field: [7201] }, - { uuid: 8752, card_lv: 2, icon: "Sword-FA_WP_Main_Sword_007_Blue", name: "攻击加成", info: "全体攻击力+20%", field: [7202] }, - { uuid: 8753, card_lv: 2, icon: "Blunt-FA_WP_Main_Blunt_004_Gray", name: "击晕加成", info: "全体击晕概率+20%", field: [7203] }, - { uuid: 8754, card_lv: 2, icon: "Axe-FA_WP_Main_Axe_006_WoodBronze", name: "暴击加成", info: "全体暴击率+20%", field: [7204] }, - { uuid: 8755, card_lv: 2, icon: "Bow-FA_WP_Main_Bow_010_Blue", name: "暴伤加成", info: "全体暴击伤害+40%", field: [7205] }, - { uuid: 8756, card_lv: 2, icon: "Crossbow-FA_WP_Main_Crossbow_004_Gray", name: "攻速加成", info: "全体攻击速度+20%", field: [7206] }, - { uuid: 8757, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "生命加成", info: "全体最大生命+20%", field: [7207] }, - { uuid: 8758, card_lv: 2, icon: "Wand-FA_WP_Main_Wand_003_BlueWood", name: "风怒加成", info: "全体风怒概率+20%", field: [7208] }, - { uuid: 8759, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "穿刺加成", info: "全体穿刺概率+20%", field: [7209] }, - { uuid: 8763, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "破甲加成", info: "全体穿透后伤害+20%", field: [7220] }, - { uuid: 8760, card_lv: 2, icon: "Shield-FA_WP_Sub_Shield_008_BlueGold", name: "金币收益", info: "每回合金币收益+2", field: [7210] }, - { uuid: 8761, card_lv: 2, icon: "Shield-FA_WP_Sub_Shield_008_BlueGold", name: "购买优惠", info: "购买卡牌费用-2金币", field: [7212] }, - { uuid: 8762, card_lv: 2, icon: "Staff-FA_WP_Main_Staff_007_WoodGray", name: "刷新优惠", info: "刷新卡牌费用-1金币", field: [7213] }, + { uuid: 8751, card_lv: 2, icon: "Helmet-FA_Helmet_022_DarkBlue", name: "战后恢复", info: "战斗结束生命回复量+20%", field: [{ uuid: 7001, value: 0.2 }] }, + { uuid: 8752, card_lv: 2, icon: "Sword-FA_WP_Main_Sword_007_Blue", name: "攻击加成", info: "全体攻击力+20%", field: [{ uuid: 7002, value: 0.2 }] }, + { uuid: 8753, card_lv: 2, icon: "Blunt-FA_WP_Main_Blunt_004_Gray", name: "击晕加成", info: "全体击晕概率+20%", field: [{ uuid: 7003, value: 0.2 }] }, + { uuid: 8754, card_lv: 2, icon: "Axe-FA_WP_Main_Axe_006_WoodBronze", name: "暴击加成", info: "全体暴击率+20%", field: [{ uuid: 7004, value: 0.2 }] }, + { uuid: 8755, card_lv: 2, icon: "Bow-FA_WP_Main_Bow_010_Blue", name: "暴伤加成", info: "全体暴击伤害+40%", field: [{ uuid: 7005, value: 0.4 }] }, + { uuid: 8756, card_lv: 2, icon: "Crossbow-FA_WP_Main_Crossbow_004_Gray", name: "攻速加成", info: "全体攻击速度+20%", field: [{ uuid: 7006, value: 0.2 }] }, + { uuid: 8757, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "生命加成", info: "全体最大生命+20%", field: [{ uuid: 7007, value: 0.2 }] }, + { uuid: 8758, card_lv: 2, icon: "Wand-FA_WP_Main_Wand_003_BlueWood", name: "风怒加成", info: "全体风怒概率+20%", field: [{ uuid: 7008, value: 0.2 }] }, + { uuid: 8759, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "穿刺加成", info: "全体穿刺概率+20%", field: [{ uuid: 7009, value: 0.2 }] }, + { uuid: 8763, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "破甲加成", info: "全体穿透后伤害+20%", field: [{ uuid: 7020, value: 0.2 }] }, + { uuid: 8760, card_lv: 2, icon: "Shield-FA_WP_Sub_Shield_008_BlueGold", name: "金币收益", info: "每回合金币收益+2", field: [{ uuid: 7010, value: 2 }] }, + { uuid: 8761, card_lv: 2, icon: "Shield-FA_WP_Sub_Shield_008_BlueGold", name: "购买优惠", info: "购买卡牌费用-2金币", field: [{ uuid: 7012, value: 2 }] }, + { uuid: 8762, card_lv: 2, icon: "Staff-FA_WP_Main_Staff_007_WoodGray", name: "刷新优惠", info: "刷新卡牌费用-1金币", field: [{ uuid: 7013, value: 1 }] }, // 多词条装备 - { uuid: 8770, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "守卫护甲", info: "全体最大生命+20%, 战后生命回复+20%, 攻速+20%", field: [7207, 7201, 7206] }, + { uuid: 8770, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "守卫护甲", info: "全体最大生命+20%, 战后生命回复+20%, 攻速+20%", field: [{ uuid: 7007, value: 0.2 }, { uuid: 7001, value: 0.2 }, { uuid: 7006, value: 0.2 }] }, // ==================== card_lv 3 档(强度 ×3) ==================== - { uuid: 8801, card_lv: 3, icon: "Helmet-FA_Helmet_021_RedGold", name: "战后恢复", info: "战斗结束生命回复量+30%", field: [7401] }, - { uuid: 8802, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击加成", info: "全体攻击力+30%", field: [7402] }, - { uuid: 8803, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "击晕加成", info: "全体击晕概率+30%", field: [7403] }, - { uuid: 8804, card_lv: 3, icon: "Axe-FA_WP_Main_Axe_012_WoodGold", name: "暴击加成", info: "全体暴击率+30%", field: [7404] }, - { uuid: 8805, card_lv: 3, icon: "Bow-FA_WP_Main_Bow_010_Gold", name: "暴伤加成", info: "全体暴击伤害+60%", field: [7405] }, - { uuid: 8806, card_lv: 3, icon: "Crossbow-FA_WP_Main_Crossbow_005_WoodGold", name: "攻速加成", info: "全体攻击速度+30%", field: [7406] }, - { uuid: 8807, card_lv: 3, icon: "Chest-FA_Chest_015_RedGold", name: "生命加成", info: "全体最大生命+30%", field: [7407] }, - { uuid: 8808, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "风怒加成", info: "全体风怒概率+30%", field: [7408] }, - { uuid: 8809, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "穿刺加成", info: "全体穿刺概率+30%", field: [7409] }, - { uuid: 8817, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "破甲加成", info: "全体穿透后伤害+30%", field: [7420] }, - { uuid: 8810, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "金币收益", info: "每回合金币收益+3", field: [7410] }, + { uuid: 8801, card_lv: 3, icon: "Helmet-FA_Helmet_021_RedGold", name: "战后恢复", info: "战斗结束生命回复量+30%", field: [{ uuid: 7001, value: 0.3 }] }, + { uuid: 8802, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击加成", info: "全体攻击力+30%", field: [{ uuid: 7002, value: 0.3 }] }, + { uuid: 8803, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "击晕加成", info: "全体击晕概率+30%", field: [{ uuid: 7003, value: 0.3 }] }, + { uuid: 8804, card_lv: 3, icon: "Axe-FA_WP_Main_Axe_012_WoodGold", name: "暴击加成", info: "全体暴击率+30%", field: [{ uuid: 7004, value: 0.3 }] }, + { uuid: 8805, card_lv: 3, icon: "Bow-FA_WP_Main_Bow_010_Gold", name: "暴伤加成", info: "全体暴击伤害+60%", field: [{ uuid: 7005, value: 0.6 }] }, + { uuid: 8806, card_lv: 3, icon: "Crossbow-FA_WP_Main_Crossbow_005_WoodGold", name: "攻速加成", info: "全体攻击速度+30%", field: [{ uuid: 7006, value: 0.3 }] }, + { uuid: 8807, card_lv: 3, icon: "Chest-FA_Chest_015_RedGold", name: "生命加成", info: "全体最大生命+30%", field: [{ uuid: 7007, value: 0.3 }] }, + { uuid: 8808, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "风怒加成", info: "全体风怒概率+30%", field: [{ uuid: 7008, value: 0.3 }] }, + { uuid: 8809, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "穿刺加成", info: "全体穿刺概率+30%", field: [{ uuid: 7009, value: 0.3 }] }, + { uuid: 8817, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "破甲加成", info: "全体穿透后伤害+30%", field: [{ uuid: 7020, value: 0.3 }] }, + { uuid: 8810, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "金币收益", info: "每回合金币收益+3", field: [{ uuid: 7010, value: 3 }] }, // 触发次数强化 - { uuid: 8811, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "召唤强化", info: "召唤触发技能次数+1", field: [7014] }, - { uuid: 8812, card_lv: 3, icon: "Staff-FA_WP_Main_Staff_005_WoodGold", name: "死亡强化", info: "死亡触发技能次数+1", field: [7015] }, - { uuid: 8813, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "开场强化", info: "战斗开始触发技能次数+1", field: [7016] }, - { uuid: 8814, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "结束强化", info: "战斗结束触发技能次数+1", field: [7017] }, - { uuid: 8815, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击强化", info: "攻击触发技能次数+1", field: [7018] }, - { uuid: 8816, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "受击强化", info: "被攻击触发技能次数+1", field: [7019] }, + { uuid: 8811, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "召唤强化", info: "召唤触发技能次数+1", field: [{ uuid: 7014, value: 1 }] }, + { uuid: 8812, card_lv: 3, icon: "Staff-FA_WP_Main_Staff_005_WoodGold", name: "死亡强化", info: "死亡触发技能次数+1", field: [{ uuid: 7015, value: 1 }] }, + { uuid: 8813, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "开场强化", info: "战斗开始触发技能次数+1", field: [{ uuid: 7016, value: 1 }] }, + { uuid: 8814, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "结束强化", info: "战斗结束触发技能次数+1", field: [{ uuid: 7017, value: 1 }] }, + { uuid: 8815, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击强化", info: "攻击触发技能次数+1", field: [{ uuid: 7018, value: 1 }] }, + { uuid: 8816, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "受击强化", info: "被攻击触发技能次数+1", field: [{ uuid: 7019, value: 1 }] }, // 多词条装备 - { uuid: 8820, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "神圣之刃", info: "全体攻击力+30%, 暴击率+30%, 暴击伤害+60%, 攻速+30%", field: [7402, 7404, 7405, 7406] }, + { uuid: 8820, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "神圣之刃", info: "全体攻击力+30%, 暴击率+30%, 暴击伤害+60%, 攻速+30%", field: [{ uuid: 7002, value: 0.3 }, { uuid: 7004, value: 0.3 }, { uuid: 7005, value: 0.6 }, { uuid: 7006, value: 0.3 }] }, ]; /** diff --git a/assets/script/game/common/config/HeroSkillDesc.ts b/assets/script/game/common/config/HeroSkillDesc.ts index ad824fce..4ed4421a 100644 --- a/assets/script/game/common/config/HeroSkillDesc.ts +++ b/assets/script/game/common/config/HeroSkillDesc.ts @@ -1,4 +1,4 @@ -/** +/** * @file HeroSkillDesc.ts * @description 英雄技能/能力描述的【唯一文字表达标准层】 * @@ -28,7 +28,7 @@ * - SkillDescSet:结构化描述模板 * - FieldSkillSet(驻场技能)、BuffList(计时 buff 默认值兜底)、Attrs(属性枚举) */ -import { SkillTriggerName, SkillTriggerType, TriggerGrouped, LvTriggerEntry, LvFieldEntry, LvReviveEntry, LvBonusEntry, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, getTriggerSkillName, HGrowType, calcGrowBonus } from "./heroSet"; +import { SkillTriggerName, SkillTriggerType, TriggerGrouped, LvTriggerEntry, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, getTriggerSkillName, HGrowType, calcGrowBonus } from "./heroSet"; import { FieldSkillSet, mergeSkillParams, SkillConfig, SkillKind, SkillOverrides, SkillSet, TGroup } from "./SkillSet"; import { FieldDescSet, FieldValueFmt, SkillDescSet } from "./SkillDescSet"; import { BuffList } from "./BuffSet"; @@ -242,26 +242,26 @@ function buildEffectLine(head: string, skill: SkillConfig): ISkillLine { * @param showName 是否在行中包含「技能名」片段(英雄面板需要,装备商店不需要) * @param nameOverride 技能名覆盖(英雄语境传入 heroSet 语境专属命名,缺省用 FieldSkillSet 通用名) */ -function buildFieldLine(head: string, uuid: number, showName: boolean = true, nameOverride?: string): ISkillLine | null { - const fs = FieldSkillSet[uuid]; +function buildFieldLine(head: string, entry: FieldEntry, showName: boolean = true, nameOverride?: string): ISkillLine | null { + const fs = FieldSkillSet[entry.uuid]; if (!fs) return null; const desc = FieldDescSet[fs.type]; const nameSeg = showName ? `「${nameOverride ?? fs.name}」 ` : ""; // 未入表类型回退基础备注 info,整行不高亮 if (!desc) return { prefix: `${head}${nameSeg}${fs.info}`, value: "", suffix: "" }; - // 数值按格式渲染为高亮片段 + // 数值按格式渲染为高亮片段(数值取自词条自身 value) let valueText: string; switch (desc.fmt) { case FieldValueFmt.Percent: - valueText = `+${Math.round(fs.value * 100)}%`; + valueText = `+${Math.round(entry.value * 100)}%`; break; case FieldValueFmt.IntMinus: - valueText = `-${fs.value}`; + valueText = `-${entry.value}`; break; case FieldValueFmt.Int: default: - valueText = `+${fs.value}`; + valueText = `+${entry.value}`; break; } return { prefix: `${head}${nameSeg}${desc.verb}`, value: valueText, suffix: "" }; @@ -433,8 +433,8 @@ function buildSkillLines(source: ISkillDescSource, showName: boolean = true, sho if (fieldEntries?.length) { const tpl = SkillTriggerName[SkillTriggerType.Field] ?? "光环"; if (!showLocked) { - for (const uuid of resolveFieldByLv(fieldEntries, lv)) { - const line = buildFieldLine(`${tpl}:`, uuid, showName); + for (const entry of resolveFieldByLv(fieldEntries, lv)) { + const line = buildFieldLine(`${tpl}:`, entry, showName); if (line) lines.push(line); } } else { @@ -444,15 +444,15 @@ function buildSkillLines(source: ISkillDescSource, showName: boolean = true, sho let activeTier: LvFieldEntry | undefined; for (const tier of sorted) { if (tier.lv <= lv) activeTier = tier; } if (activeTier) { - for (const uuid of activeTier.uuids) { - const line = buildFieldLine(`Lv${activeTier.lv}: ${tpl} `, uuid, showName); + for (const entry of activeTier.uuids) { + const line = buildFieldLine(`Lv${activeTier.lv}: ${tpl} `, entry, showName); if (line) lines.push(line); } } for (const tier of sorted) { if (tier.lv <= lv) continue; - for (const uuid of tier.uuids) { - const line = buildFieldLine(`Lv${tier.lv}: ${tpl} `, uuid, showName); + for (const entry of tier.uuids) { + const line = buildFieldLine(`Lv${tier.lv}: ${tpl} `, entry, showName); if (!line) continue; line.locked = true; lines.push(line); @@ -525,15 +525,15 @@ export function buildSingleSkillRich(skillUuid: number, overrides?: SkillOverrid /** * 装备/驻场光环详情富文本:展示全部词条,数值绿色高亮。 - * @param fieldUuids FieldSkillSet 驻场光环 UUID 数组 - * @param showName 是否包含「技能名」片段(英雄面板 true,装备商店 false) - * @returns 多行富文本串,每行一个词条 + * @param entries 驻场光环词条数组(uuid 指向 FieldSkillSet 底座,value 为生效数值) + * @param showName 是否包含「技能名」片段(英雄面板 true,装备商店 false) + * @returns 多行富文本串,每行一个词条 */ -export function buildEquipRich(fieldUuids: number[], showName: boolean = false): string { - if (!fieldUuids?.length) return "无词条"; +export function buildEquipRich(entries: FieldEntry[], showName: boolean = false): string { + if (!entries?.length) return "无词条"; const lines: string[] = []; - for (const uuid of fieldUuids) { - const line = buildFieldLine("", uuid, showName); + for (const entry of entries) { + const line = buildFieldLine("", entry, showName); if (!line) continue; const prefix = line.prefix.replace(SKILL_NAME_PATTERN, (m, g1) => skillNameRich(g1)); const text = line.value @@ -604,14 +604,18 @@ export function buildSkillDescMoreRich(source: ISkillDescSource): string { } } - // 驻场光环(field):技能名按档位带数字后缀(如 [攻击光环1]/[攻击光环2]),便于玩家识别成长 + // 驻场光环(field):技能名带档位数字后缀(按 lv 档升序,1 起始),便于玩家识别成长 const fieldEntries = source[SkillTriggerType.Field] as LvFieldEntry[] | undefined; if (fieldEntries?.length) { - for (const uuid of resolveFieldByLv(fieldEntries, lv)) { - // uuid 百位编码档位:7002 基础(0)=1、7202 +(2)=2、7402 ++(4)=3 - const tier = Math.floor((uuid % 1000) / 100) / 2 + 1; - const baseName = getTriggerSkillName(SkillTriggerType.Field, uuid); - const line = buildFieldLine("", uuid, true, `${baseName}${tier}`); + // 按 lv 升序确定当前生效档的序号(1 起始),作为技能名后缀 + const sorted = [...fieldEntries].sort((a, b) => a.lv - b.lv); + let tier = 1; + for (let i = 0; i < sorted.length; i++) { + if (sorted[i].lv <= lv) tier = i + 1; + } + for (const entry of resolveFieldByLv(fieldEntries, lv)) { + const baseName = getTriggerSkillName(SkillTriggerType.Field, entry.uuid); + const line = buildFieldLine("", entry, true, `${baseName}${tier}`); if (line) lines.push(effectRich(line)); } } diff --git a/assets/script/game/common/config/SkillDescSet.ts b/assets/script/game/common/config/SkillDescSet.ts index 69518f63..157044cd 100644 --- a/assets/script/game/common/config/SkillDescSet.ts +++ b/assets/script/game/common/config/SkillDescSet.ts @@ -281,7 +281,7 @@ export interface FieldDescConfig { /** * 驻场光环描述表,key = FieldSkillType。 - * 数值永远取 FieldSkillConfig.value 实时渲染,替代手写 info,杜绝漂移。 + * 数值取配置处词条(FieldEntry.value)实时渲染,替代手写 info,杜绝漂移。 */ export const FieldDescSet: Record = { [FieldSkillType.SummonCount]: { verb: "召唤触发技能次数", fmt: FieldValueFmt.Int }, diff --git a/assets/script/game/common/config/SkillSet.ts b/assets/script/game/common/config/SkillSet.ts index fb98c956..3f072d54 100644 --- a/assets/script/game/common/config/SkillSet.ts +++ b/assets/script/game/common/config/SkillSet.ts @@ -1,4 +1,4 @@ -// ========== 从 HeroAttrs.ts 导入属性相关定义 ========== +// ========== 从 HeroAttrs.ts 导入属性相关定义 ========== import { Attrs } from "./HeroAttrs"; export enum HSSet { @@ -486,73 +486,37 @@ export interface FieldSkillConfig { name: string; icon: string; // 新增图标字段 type: FieldSkillType; - value: number; // 提升的数值 - info: string; + info: string; // 描述模板(不含具体数值,数值由配置处携带) } +/** + * 驻场光环底座表:每个 FieldSkillType 仅保留一条基础配置。 + * + * Why: 同一光环因数值不同拆成多个 uuid(7002/7202/7402)会造成大量重复条目。 + * 合并后数值由配置处(heroSet/EquipSet 的 field 条目)携带,此处只维护 + * 类型/图标/名称等元数据。所有光环 uuid 统一使用 7001~7020 基础段。 + */ export const FieldSkillSet: Record = { + 7001: { uuid: 7001, name: "战后恢复", icon: "Stat_PotionBoost", type: FieldSkillType.WaveHeal, info: "战斗结束生命回复量提升" }, + 7002: { uuid: 7002, name: "攻击光环", icon: "Stat_Attack_03", type: FieldSkillType.HeroAtk, info: "英雄攻击力提升" }, + 7003: { uuid: 7003, name: "击晕光环", icon: "Stat_Stun_01", type: FieldSkillType.HeroStun, info: "英雄击晕概率提升" }, + 7004: { uuid: 7004, name: "暴击光环", icon: "Stat_CriticalChance_02", type: FieldSkillType.HeroCrit, info: "英雄暴击率提升" }, + 7005: { uuid: 7005, name: "暴伤光环", icon: "Stat_Critical_01", type: FieldSkillType.HeroCritDamage, info: "英雄暴击伤害提升" }, + 7006: { uuid: 7006, name: "攻速光环", icon: "Stat_AttackSpeed_02", type: FieldSkillType.HeroSpeed, info: "英雄攻击速度提升" }, + 7007: { uuid: 7007, name: "生命光环", icon: "Stat_Hp_02", type: FieldSkillType.HeroHp, info: "英雄最大生命提升" }, + 7008: { uuid: 7008, name: "风怒光环", icon: "Stat_CriticalComboChance", type: FieldSkillType.HeroWindFury, info: "英雄风怒概率提升" }, + 7009: { uuid: 7009, name: "穿刺光环", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPuncture, info: "英雄穿刺概率提升" }, + 7010: { uuid: 7010, name: "金币收益", icon: "Stat_InventorySlotIncrease", type: FieldSkillType.WaveGold, info: "每回合金币收益提升" }, + 7011: { uuid: 7011, name: "出售强化", icon: "Stat_GoldGainIncrease_01", type: FieldSkillType.SellGold, info: "卖出英雄金币提升" }, + 7012: { uuid: 7012, name: "购买优惠", icon: "Stat_KeyCapacityIncrease", type: FieldSkillType.BuyDiscount, info: "购买卡牌费用减免" }, + 7013: { uuid: 7013, name: "刷新优惠", icon: "Stat_RandomBonus", type: FieldSkillType.RefreshDiscount, info: "刷新卡牌费用减免" }, - 7001: { uuid: 7001, name: "战后恢复", icon: "Stat_PotionBoost", type: FieldSkillType.WaveHeal, value: 0.1, info: "战斗结束生命回复量+10%" }, - 7002: { uuid: 7002, name: "攻击光环", icon: "Stat_Attack_03", type: FieldSkillType.HeroAtk, value: 0.1, info: "英雄攻击力+10%" }, - 7003: { uuid: 7003, name: "击晕光环", icon: "Stat_Stun_01", type: FieldSkillType.HeroStun, value: 0.1, info: "英雄击晕概率+10%" }, - 7004: { uuid: 7004, name: "暴击光环", icon: "Stat_CriticalChance_02", type: FieldSkillType.HeroCrit, value: 0.1, info: "英雄暴击率+10%" }, - 7005: { uuid: 7005, name: "暴伤光环", icon: "Stat_Critical_01", type: FieldSkillType.HeroCritDamage, value: 0.2, info: "英雄暴击伤害+20%" }, - 7006: { uuid: 7006, name: "攻速光环", icon: "Stat_AttackSpeed_02", type: FieldSkillType.HeroSpeed, value: 0.1, info: "英雄攻击速度+10%" }, - 7007: { uuid: 7007, name: "生命光环", icon: "Stat_Hp_02", type: FieldSkillType.HeroHp, value: 0.1, info: "英雄最大生命+10%" }, - 7008: { uuid: 7008, name: "风怒光环", icon: "Stat_CriticalComboChance", type: FieldSkillType.HeroWindFury, value: 0.1, info: "英雄风怒概率+10%" }, - 7009: { uuid: 7009, name: "穿刺光环", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPuncture, value: 0.1, info: "英雄穿刺概率+10%" }, - - 7010: { uuid: 7010, name: "金币收益", icon: "Stat_InventorySlotIncrease", type: FieldSkillType.WaveGold, value: 1, info: "每回合金币收益+1" }, - 7011: { uuid: 7011, name: "出售强化", icon: "Stat_GoldGainIncrease_01", type: FieldSkillType.SellGold, value: 1, info: "卖出英雄金币+1" }, - 7012: { uuid: 7012, name: "购买优惠", icon: "Stat_KeyCapacityIncrease", type: FieldSkillType.BuyDiscount, value: 1, info: "购买卡牌费用-1金币" }, - 7013: { uuid: 7013, name: "刷新优惠", icon: "Stat_RandomBonus", type: FieldSkillType.RefreshDiscount, value: 1, info: "刷新卡牌费用-1金币" }, - - 7014: { uuid: 7014, name: "召唤强化", icon: "Stat_UnitSummonIncrease_02", type: FieldSkillType.SummonCount, value: 1, info: "召唤触发技能次数+1" }, - 7015: { uuid: 7015, name: "死亡强化", icon: "Stat_PoisonChanceIncrease", type: FieldSkillType.DeadCount, value: 1, info: "死亡触发技能次数+1" }, - 7016: { uuid: 7016, name: "开场强化", icon: "Stat_AttackRangeIncrease_01", type: FieldSkillType.StartCount, value: 1, info: "战斗开始触发技能次数+1" }, - 7017: { uuid: 7017, name: "结束强化", icon: "Stat_UnitSummonIncrease_01", type: FieldSkillType.EndCount, value: 1, info: "战斗结束触发技能次数+1" }, - 7018: { uuid: 7018, name: "攻击强化", icon: "Stat_Attack_03", type: FieldSkillType.AtkCount, value: 1, info: "攻击触发技能次数+1" }, - 7019: { uuid: 7019, name: "受击强化", icon: "Stat_Armor_01", type: FieldSkillType.BeAtkCount, value: 1, info: "被攻击触发技能次数+1" }, - 7020: { uuid: 7020, name: "穿透强化", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, value: 0.1, info: "英雄穿透后伤害+10%" }, - - // ============ wave5 档(原值 ×2) ============ - - 7201: { uuid: 7201, name: "战后恢复+", icon: "Stat_PotionBoost", type: FieldSkillType.WaveHeal, value: 0.2, info: "战斗结束生命回复量+20%" }, - 7202: { uuid: 7202, name: "攻击光环+", icon: "Stat_Attack_03", type: FieldSkillType.HeroAtk, value: 0.2, info: "英雄攻击力+20%" }, - 7203: { uuid: 7203, name: "击晕光环+", icon: "Stat_Stun_01", type: FieldSkillType.HeroStun, value: 0.2, info: "英雄击晕概率+20%" }, - 7204: { uuid: 7204, name: "暴击光环+", icon: "Stat_CriticalChance_02", type: FieldSkillType.HeroCrit, value: 0.2, info: "英雄暴击率+20%" }, - 7205: { uuid: 7205, name: "暴伤光环+", icon: "Stat_Critical_01", type: FieldSkillType.HeroCritDamage, value: 0.4, info: "英雄暴击伤害+40%" }, - 7206: { uuid: 7206, name: "攻速光环+", icon: "Stat_AttackSpeed_02", type: FieldSkillType.HeroSpeed, value: 0.2, info: "英雄攻击速度+20%" }, - 7207: { uuid: 7207, name: "生命光环+", icon: "Stat_Hp_02", type: FieldSkillType.HeroHp, value: 0.2, info: "英雄最大生命+20%" }, - 7208: { uuid: 7208, name: "风怒光环+", icon: "Stat_CriticalComboChance", type: FieldSkillType.HeroWindFury, value: 0.2, info: "英雄风怒概率+20%" }, - 7209: { uuid: 7209, name: "穿刺光环+", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPuncture, value: 0.2, info: "英雄穿刺概率+20%" }, - - - 7210: { uuid: 7210, name: "金币收益+", icon: "Stat_InventorySlotIncrease", type: FieldSkillType.WaveGold, value: 2, info: "每回合金币收益+2" }, - 7211: { uuid: 7211, name: "出售强化+", icon: "Stat_GoldGainIncrease_01", type: FieldSkillType.SellGold, value: 2, info: "卖出英雄金币+2" }, - 7212: { uuid: 7212, name: "购买优惠+", icon: "Stat_KeyCapacityIncrease", type: FieldSkillType.BuyDiscount, value: 2, info: "购买卡牌费用-2金币" }, - 7213: { uuid: 7213, name: "刷新优惠+", icon: "Stat_RandomBonus", type: FieldSkillType.RefreshDiscount, value: 2, info: "刷新卡牌费用-2金币" }, - - 7220: { uuid: 7220, name: "穿透强化+", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, value: 0.2, info: "英雄穿透后伤害+20%" }, - - - - 7401: { uuid: 7401, name: "战后恢复++", icon: "Stat_PotionBoost", type: FieldSkillType.WaveHeal, value: 0.3, info: "战斗结束生命回复量+30%" }, - 7402: { uuid: 7402, name: "攻击光环++", icon: "Stat_Attack_03", type: FieldSkillType.HeroAtk, value: 0.3, info: "英雄攻击力+30%" }, - 7403: { uuid: 7403, name: "击晕光环++", icon: "Stat_Stun_01", type: FieldSkillType.HeroStun, value: 0.3, info: "英雄击晕概率+30%" }, - 7404: { uuid: 7404, name: "暴击光环++", icon: "Stat_CriticalChance_02", type: FieldSkillType.HeroCrit, value: 0.3, info: "英雄暴击率+30%" }, - 7405: { uuid: 7405, name: "暴伤光环++", icon: "Stat_Critical_01", type: FieldSkillType.HeroCritDamage, value: 0.6, info: "英雄暴击伤害+60%" }, - 7406: { uuid: 7406, name: "攻速光环++", icon: "Stat_AttackSpeed_02", type: FieldSkillType.HeroSpeed, value: 0.3, info: "英雄攻击速度+30%" }, - 7407: { uuid: 7407, name: "生命光环++", icon: "Stat_Hp_02", type: FieldSkillType.HeroHp, value: 0.3, info: "英雄最大生命+30%" }, - 7408: { uuid: 7408, name: "风怒光环++", icon: "Stat_CriticalComboChance", type: FieldSkillType.HeroWindFury, value: 0.3, info: "英雄风怒概率+30%" }, - 7409: { uuid: 7409, name: "穿刺光环++", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPuncture, value: 0.3, info: "英雄穿刺概率+30%" }, - - - 7410: { uuid: 7410, name: "金币收益++", icon: "Stat_InventorySlotIncrease", type: FieldSkillType.WaveGold, value: 3, info: "每回合金币收益+3" }, - 7411: { uuid: 7411, name: "出售强化++", icon: "Stat_GoldGainIncrease_01", type: FieldSkillType.SellGold, value: 3, info: "卖出英雄金币+3" }, - 7412: { uuid: 7412, name: "购买优惠++", icon: "Stat_KeyCapacityIncrease", type: FieldSkillType.BuyDiscount, value: 3, info: "购买卡牌费用-3金币" }, - 7413: { uuid: 7413, name: "刷新优惠++", icon: "Stat_RandomBonus", type: FieldSkillType.RefreshDiscount, value: 3, info: "刷新卡牌费用-3金币" }, - - 7420: { uuid: 7420, name: "穿透强化++", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, value: 0.3, info: "英雄穿透后伤害+30%" }, + 7014: { uuid: 7014, name: "召唤强化", icon: "Stat_UnitSummonIncrease_02", type: FieldSkillType.SummonCount, info: "召唤触发技能次数提升" }, + 7015: { uuid: 7015, name: "死亡强化", icon: "Stat_PoisonChanceIncrease", type: FieldSkillType.DeadCount, info: "死亡触发技能次数提升" }, + 7016: { uuid: 7016, name: "开场强化", icon: "Stat_AttackRangeIncrease_01", type: FieldSkillType.StartCount, info: "战斗开始触发技能次数提升" }, + 7017: { uuid: 7017, name: "结束强化", icon: "Stat_UnitSummonIncrease_01", type: FieldSkillType.EndCount, info: "战斗结束触发技能次数提升" }, + 7018: { uuid: 7018, name: "攻击强化", icon: "Stat_Attack_03", type: FieldSkillType.AtkCount, info: "攻击触发技能次数提升" }, + 7019: { uuid: 7019, name: "受击强化", icon: "Stat_Armor_01", type: FieldSkillType.BeAtkCount, info: "被攻击触发技能次数提升" }, + 7020: { uuid: 7020, name: "穿透强化", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, info: "英雄穿透后伤害提升(百分点)" }, }; diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 27d299c4..4319b934 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -258,14 +258,8 @@ export const TriggerSkillNameSet: Record> = { export function getTriggerSkillName(type: SkillTriggerType, s_uuid: number): string { const group = TriggerSkillNameSet[type]; if (group) { - // 直接命中 const direct = group[s_uuid]; if (direct) return direct; - // 驻场光环 +/++ 档(如 7202/7402)回退到基础档命名(7002) - if (type === SkillTriggerType.Field) { - const base = group[7000 + (s_uuid % 100)]; - if (base) return base; - } } // 驻场光环 uuid 存于 FieldSkillSet,触发技能存于 SkillSet,分别兜底 if (type === SkillTriggerType.Field) { @@ -337,11 +331,20 @@ export interface LvTriggerEntry { export type TriggerGrouped = Record; /** - * 驻场光环按等级解锁:运行时取 ≤英雄等级 的最大 lv 档的 uuids。 + * 驻场光环词条:uuid 指向 FieldSkillSet 底座(类型/图标/名称元数据), + * value 为该词条实际生效数值(由配置处按档位指定,不再随 uuid 分档)。 + */ +export interface FieldEntry { + uuid: number; + value: number; +} + +/** + * 驻场光环按等级解锁:运行时取 ≤英雄等级 的最大 lv 档的词条列表。 */ export interface LvFieldEntry { lv: number; - uuids: number[]; + uuids: FieldEntry[]; } /** @@ -430,9 +433,9 @@ export const HeroInfo: Record = { uuid: 5005, name: "战歌法师", path: "hm2", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 143, ap: 40, skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } }, field: [ - { lv: 1, uuids: [7002] }, - { lv: 3, uuids: [7202] }, - { lv: 5, uuids: [7402] }, + { lv: 1, uuids: [{ uuid: 7002, value: 0.1 }] }, + { lv: 3, uuids: [{ uuid: 7002, value: 0.2 }] }, + { lv: 5, uuids: [{ uuid: 7002, value: 0.3 }] }, ], info: "", }, @@ -496,9 +499,9 @@ export const HeroInfo: Record = { uuid: 5105, name: "风怒先知", path: "hm1", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 287, ap: 80, skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } }, field: [ - { lv: 1, uuids: [7006] }, - { lv: 3, uuids: [7206] }, - { lv: 5, uuids: [7406] }, + { lv: 1, uuids: [{ uuid: 7006, value: 0.1 }] }, + { lv: 3, uuids: [{ uuid: 7006, value: 0.2 }] }, + { lv: 5, uuids: [{ uuid: 7006, value: 0.3 }] }, ], info: "", }, @@ -575,9 +578,9 @@ export const HeroInfo: Record = { uuid: 5205, name: "精准术士", path: "hm3", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 430, ap: 120, skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } }, field: [ - { lv: 1, uuids: [7004] }, - { lv: 3, uuids: [7204] }, - { lv: 5, uuids: [7404] }, + { lv: 1, uuids: [{ uuid: 7004, value: 0.1 }] }, + { lv: 3, uuids: [{ uuid: 7004, value: 0.2 }] }, + { lv: 5, uuids: [{ uuid: 7004, value: 0.3 }] }, ], info: "", }, @@ -651,9 +654,9 @@ export const HeroInfo: Record = { uuid: 5305, name: "领域贤者", path: "hm2", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 573, ap: 160, skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } }, field: [ - { lv: 1, uuids: [7005, 7006] }, - { lv: 3, uuids: [7205, 7206] }, - { lv: 5, uuids: [7405, 7406] }, + { lv: 1, uuids: [{ uuid: 7005, value: 0.2 }, { uuid: 7006, value: 0.1 }] }, + { lv: 3, uuids: [{ uuid: 7005, value: 0.4 }, { uuid: 7006, value: 0.2 }] }, + { lv: 5, uuids: [{ uuid: 7005, value: 0.6 }, { uuid: 7006, value: 0.3 }] }, ], info: "", }, @@ -690,9 +693,9 @@ export const HeroInfo: Record = { ], }, field: [ - { lv: 1, uuids: [7006] }, - { lv: 3, uuids: [7206] }, - { lv: 5, uuids: [7406] }, + { lv: 1, uuids: [{ uuid: 7006, value: 0.1 }] }, + { lv: 3, uuids: [{ uuid: 7006, value: 0.2 }] }, + { lv: 5, uuids: [{ uuid: 7006, value: 0.3 }] }, ], info: "", }, @@ -754,9 +757,9 @@ export const HeroInfo: Record = { ], }, field: [ - { lv: 1, uuids: [7007] }, - { lv: 3, uuids: [7207] }, - { lv: 5, uuids: [7407] }, + { lv: 1, uuids: [{ uuid: 7007, value: 0.1 }] }, + { lv: 3, uuids: [{ uuid: 7007, value: 0.2 }] }, + { lv: 5, uuids: [{ uuid: 7007, value: 0.3 }] }, ], info: "", }, @@ -898,8 +901,8 @@ export function resolveTriggerByLv(grouped: TriggerGrouped | undefined, lv: numb return result; } -/** 解析驻场光环在目标等级下的有效 uuid 列表(取 ≤lv 的最大档) */ -export function resolveFieldByLv(field: LvFieldEntry[] | undefined, lv: number): number[] { +/** 解析驻场光环在目标等级下的有效词条列表(取 ≤lv 的最大档) */ +export function resolveFieldByLv(field: LvFieldEntry[] | undefined, lv: number): FieldEntry[] { if (!field || field.length === 0) return []; let pick: LvFieldEntry | undefined; for (const e of field) { @@ -1184,35 +1187,35 @@ function calcTriggerPowerDetailed( return { total, items }; } -/** 计算驻场光环技能在时间窗内的总价值 */ -function calcFieldSkillValue(field: FieldSkillConfig, hpEff: number, apEff: number, cd: number, scopeMul: number, seconds: number): number { +/** 计算驻场光环技能在时间窗内的总价值(value 由词条携带,fs 提供类型元数据) */ +function calcFieldSkillValue(fs: FieldSkillConfig, value: number, hpEff: number, apEff: number, cd: number, scopeMul: number, seconds: number): number { const weights = HERO_POWER_WEIGHTS; const dps = apEff / cd; - switch (field.type) { + switch (fs.type) { case FieldSkillType.HeroAtk: - return field.value * dps * scopeMul * weights.W_DPS_PER_SEC * seconds; + return value * dps * scopeMul * weights.W_DPS_PER_SEC * seconds; case FieldSkillType.HeroHp: - return field.value * hpEff * scopeMul * weights.W_HP; + return value * hpEff * scopeMul * weights.W_HP; case FieldSkillType.HeroSpeed: - return field.value * dps * scopeMul * weights.W_DPS_PER_SEC * seconds; + return value * dps * scopeMul * weights.W_DPS_PER_SEC * seconds; case FieldSkillType.HeroCrit: - return field.value * dps * scopeMul * 0.5 * weights.W_DPS_PER_SEC * seconds; + return value * dps * scopeMul * 0.5 * weights.W_DPS_PER_SEC * seconds; case FieldSkillType.HeroCritDamage: - return field.value * dps * scopeMul * 0.05 * weights.W_DPS_PER_SEC * seconds; + return value * dps * scopeMul * 0.05 * weights.W_DPS_PER_SEC * seconds; case FieldSkillType.HeroStun: case FieldSkillType.HeroWindFury: case FieldSkillType.HeroPuncture: case FieldSkillType.HeroPunctureDmg: - return field.value * scopeMul * weights.W_control * 100; + return value * scopeMul * weights.W_control * 100; default: - return field.value * scopeMul * weights.W_control * 10; + return value * scopeMul * weights.W_control * 10; } } /** 计算驻场光环的详细价值 */ -function calcFieldPowerDetailed(fieldUuids: number[] | undefined, hero: heroInfo, targetLv: number, seconds: number): { total: number, items: FieldSkillEval[] } { - if (!fieldUuids || fieldUuids.length === 0) return { total: 0, items: [] }; +function calcFieldPowerDetailed(entries: FieldEntry[] | undefined, hero: heroInfo, targetLv: number, seconds: number): { total: number, items: FieldSkillEval[] } { + if (!entries || entries.length === 0) return { total: 0, items: [] }; const weights = HERO_POWER_WEIGHTS; const { hp: hpEff, ap: apEff } = getEffectiveStats(hero, targetLv); const cd = getAttackCd(hero); @@ -1220,12 +1223,12 @@ function calcFieldPowerDetailed(fieldUuids: number[] | undefined, hero: heroInfo let total = 0; const items: FieldSkillEval[] = []; - for (const uuid of fieldUuids) { - const field = FieldSkillSet[uuid]; - if (!field) continue; - const value = calcFieldSkillValue(field, hpEff, apEff, cd, scopeMul, seconds) * weights.W_field_alive; + for (const entry of entries) { + const fs = FieldSkillSet[entry.uuid]; + if (!fs) continue; + const value = calcFieldSkillValue(fs, entry.value, hpEff, apEff, cd, scopeMul, seconds) * weights.W_field_alive; total += value; - items.push({ uuid, name: field.name, value }); + items.push({ uuid: entry.uuid, name: fs.name, value }); } return { total, items }; } @@ -1269,8 +1272,8 @@ export function calcHeroPowerDetailed(hero: heroInfo, targetLv: number = 1, seco const fstart = hero.fstart ? calcTriggerPowerDetailed(resolveTriggerByLv(hero.fstart, targetLv), hero, targetLv, SkillTriggerType.FStart, seconds) : { total: 0, items: [] as TriggerSkillEval[] }; const fend = hero.fend ? calcTriggerPowerDetailed(resolveTriggerByLv(hero.fend, targetLv), hero, targetLv, SkillTriggerType.FEnd, seconds) : { total: 0, items: [] as TriggerSkillEval[] }; const dead = hero.dead ? calcTriggerPowerDetailed(resolveTriggerByLv(hero.dead, targetLv), hero, targetLv, SkillTriggerType.Dead, seconds) : { total: 0, items: [] as TriggerSkillEval[] }; - const fieldUuids = resolveFieldByLv(hero.field, targetLv); - const field = fieldUuids.length > 0 ? calcFieldPowerDetailed(fieldUuids, hero, targetLv, seconds) : { total: 0, items: [] as FieldSkillEval[] }; + const fieldEntries = resolveFieldByLv(hero.field, targetLv); + const field = fieldEntries.length > 0 ? calcFieldPowerDetailed(fieldEntries, hero, targetLv, seconds) : { total: 0, items: [] as FieldSkillEval[] }; let reviveValue = 0; const revive = resolveReviveByLv(hero.revive, targetLv); diff --git a/assets/script/game/hero/FieldSkillHelper.ts b/assets/script/game/hero/FieldSkillHelper.ts index 3e835403..bd084c55 100644 --- a/assets/script/game/hero/FieldSkillHelper.ts +++ b/assets/script/game/hero/FieldSkillHelper.ts @@ -1,16 +1,20 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { FacSet } from "../common/config/GameSet"; import { FieldSkillSet, FieldSkillType } from "../common/config/SkillSet"; +import { FieldEntry } from "../common/config/heroSet"; import { HeroAttrsComp } from "./HeroAttrsComp"; import { SkillBoxComp } from "../map/SkillBoxComp"; import { EquipBoxComp } from "../map/EquipBoxComp"; /** * 驻场技能(光环属性)计算辅助类 - * + * * 核心职责: * 统一管理全场存活英雄带来的全局加成属性计算。 * 解耦原先写在 HeroAttrsComp 中的静态计算逻辑,符合单一职责原则。 + * + * 数据结构:field 列表元素为 FieldEntry({uuid,value}),uuid 仅用于查 FieldSkillSet + * 的类型元数据,实际加成数值取自词条自身的 value。 */ export class FieldSkillHelper { /** 获取指定驻场技能类型的总加成值(计算存活的友方英雄 + 场上的驻场技能卡) */ @@ -27,47 +31,37 @@ export class FieldSkillHelper { public static getFieldSkillTotalValueForFac(type: FieldSkillType, fac: number = FacSet.HERO): number { let total = 0; + // 累加一组驻场词条中匹配类型的数值 + const accumulate = (fields: FieldEntry[] | undefined): void => { + if (!fields) return; + for (const entry of fields) { + const fs = FieldSkillSet[entry.uuid]; + if (fs && fs.type === type) { + total += entry.value; + } + } + }; + // 1. 统计英雄/怪物带来的驻场技能加成 - // 读 model.runtime_field(已按当前等级 resolve 的 uuid 列表) + // 读 model.runtime_field(已按当前等级 resolve 的词条列表) ecs.query(ecs.allOf(HeroAttrsComp)).forEach((entity: ecs.Entity) => { const model = entity.get(HeroAttrsComp); if (!model || model.is_dead || model.fac !== fac) return; - const fields = model.runtime_field; - if (fields) { - for (const skillUuid of fields) { - const skillConfig = FieldSkillSet[skillUuid]; - if (skillConfig && skillConfig.type === type) { - total += skillConfig.value; - } - } - } + accumulate(model.runtime_field); }); - // 2. 统计技能盒子(技能卡)带来的驻场技能加成(仅英雄阵营) + // 2. 统计技能盒子(技能卡)与装备盒(装备卡)带来的驻场技能加成(仅英雄阵营) if (fac === FacSet.HERO) { ecs.query(ecs.allOf(SkillBoxComp)).forEach((entity: ecs.Entity) => { const skillBox = entity.get(SkillBoxComp); - if (!skillBox || !skillBox.field || skillBox.field.length === 0) return; - - for (const skillUuid of skillBox.field) { - const skillConfig = FieldSkillSet[skillUuid]; - if (skillConfig && skillConfig.type === type) { - total += skillConfig.value; - } - } + if (!skillBox) return; + accumulate(skillBox.field); }); - // 3. 统计装备盒(装备卡)带来的驻场技能加成(仅英雄阵营) ecs.query(ecs.allOf(EquipBoxComp)).forEach((entity: ecs.Entity) => { const equipBox = entity.get(EquipBoxComp); - if (!equipBox || !equipBox.field || equipBox.field.length === 0) return; - - for (const skillUuid of equipBox.field) { - const skillConfig = FieldSkillSet[skillUuid]; - if (skillConfig && skillConfig.type === type) { - total += skillConfig.value; - } - } + if (!equipBox) return; + accumulate(equipBox.field); }); } diff --git a/assets/script/game/hero/HeroAttrsComp.ts b/assets/script/game/hero/HeroAttrsComp.ts index 69a6003d..3931dc94 100644 --- a/assets/script/game/hero/HeroAttrsComp.ts +++ b/assets/script/game/hero/HeroAttrsComp.ts @@ -1,5 +1,5 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; -import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType, TriggerGrouped, LvFieldEntry, LvReviveEntry, LvBonusEntry } from "../common/config/heroSet"; +import { HeroDisVal, HeroInfo, HSkillInfo, HType, SkillTriggerType, TriggerGrouped, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry } from "../common/config/heroSet"; import { mLogger } from "../common/Logger"; import { FacSet, FightSet } from "../common/config/GameSet"; import { FieldSkillSet, FieldSkillType, SkillOverrides } from "../common/config/SkillSet"; @@ -69,8 +69,8 @@ export class HeroAttrsComp extends ecs.Comp { runtime_fstart?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; /** 当前等级下生效的战后触发条目 */ runtime_fend?: { s_uuid: number; t_num: number; overrides?: SkillOverrides }[]; - /** 当前等级下生效的驻场光环 uuid 列表 */ - runtime_field?: number[]; + /** 当前等级下生效的驻场光环词条列表 */ + runtime_field?: FieldEntry[]; /** 当前等级下生效的复活配置 */ runtime_revive?: { s_uuid: number; r_num: number; upr: number }; diff --git a/assets/script/game/map/EquipBoxComp.ts b/assets/script/game/map/EquipBoxComp.ts index 9f74e743..ebcb450f 100644 --- a/assets/script/game/map/EquipBoxComp.ts +++ b/assets/script/game/map/EquipBoxComp.ts @@ -37,6 +37,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu import { CardTriggerType } from "../common/config/CardSet"; import { EquipPoolList } from "../common/config/EquipSet"; import { SkillSet, SkillOverrides, FieldSkillSet } from "../common/config/SkillSet"; +import { FieldEntry } from "../common/config/heroSet"; import { oops } from "db://oops-framework/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; import { smc } from "../common/SingletonModuleComp"; @@ -93,8 +94,8 @@ export class EquipBoxComp extends CCComp { private keep_waves: number = 0; /** 技能覆写参数(自定义伤害、Buff等) */ private overrides?: SkillOverrides; - /** 驻场技能 UUID 列表 */ - public field: number[] = []; + /** 驻场技能词条列表(uuid 指向 FieldSkillSet 底座,value 为生效数值) */ + public field: FieldEntry[] = []; /** 卡牌自定义图标ID(优先级最高,未定义则按 trigger_type 自动取) */ private card_icon?: string; @@ -425,7 +426,7 @@ export class EquipBoxComp extends CCComp { if (this.trigger_type === CardTriggerType.Interval) { iconId = this.s_uuid ? SkillSet[this.s_uuid]?.icon : undefined; } else if (this.trigger_type === CardTriggerType.Field) { - const fieldUuid = this.field?.[0]; + const fieldUuid = this.field?.[0]?.uuid; iconId = fieldUuid ? FieldSkillSet[fieldUuid]?.icon : undefined; } } diff --git a/assets/script/game/map/HInfoComp.ts b/assets/script/game/map/HInfoComp.ts index 876d56e5..4df0ff54 100644 --- a/assets/script/game/map/HInfoComp.ts +++ b/assets/script/game/map/HInfoComp.ts @@ -584,7 +584,7 @@ export class HInfoComp extends CCComp { if (config.trigger_type === CardTriggerType.Interval) { iconId = config.skill ? SkillSet[config.skill]?.icon : undefined; } else if (config.trigger_type === CardTriggerType.Field) { - const fieldUuid = config.field?.[0]; + const fieldUuid = config.field?.[0]?.uuid; iconId = fieldUuid ? FieldSkillSet[fieldUuid]?.icon : undefined; } } diff --git a/assets/script/game/map/SkillBoxComp.ts b/assets/script/game/map/SkillBoxComp.ts index 26988457..c65baa40 100644 --- a/assets/script/game/map/SkillBoxComp.ts +++ b/assets/script/game/map/SkillBoxComp.ts @@ -36,6 +36,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu import { CardTriggerType, CardConfig } from "../common/config/CardSet"; import { SkillCardList } from "../common/config/SCardSet"; import { SkillOverrides } from "../common/config/SkillSet"; +import { FieldEntry } from "../common/config/heroSet"; import { oops } from "db://oops-framework/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; import { smc } from "../common/SingletonModuleComp"; @@ -93,8 +94,8 @@ export class SkillBoxComp extends CCComp { private keep_waves: number = 0; /** 技能覆写参数(自定义伤害、Buff等) */ private overrides?: SkillOverrides; - /** 驻场技能 UUID 列表 */ - public field: number[] = []; + /** 驻场技能词条列表(uuid 指向 FieldSkillSet 底座,value 为生效数值) */ + public field: FieldEntry[] = []; /** 卡牌自定义图标ID(优先级最高,未定义则按 trigger_type 自动取) */ private card_icon?: string; diff --git a/assets/script/game/map/TalentItemComp.ts b/assets/script/game/map/TalentItemComp.ts index c6e2383e..717fbb03 100644 --- a/assets/script/game/map/TalentItemComp.ts +++ b/assets/script/game/map/TalentItemComp.ts @@ -61,7 +61,7 @@ export class TalentItemComp extends CCComp { let iconId: string | undefined; if (!config.skill && config.field && config.field.length > 0) { // 驻场卡:用 FieldSkillSet[field[0]].icon - const fieldUuid = config.field[0]; + const fieldUuid = config.field[0].uuid; iconId = FieldSkillSet[fieldUuid]?.icon || `${fieldUuid}`; } else if (config.skill) { // 技能卡:用 SkillSet[skill].icon