diff --git a/assets/resources/gui/element/herobox.prefab b/assets/resources/gui/element/herobox.prefab index 338d3766..e93ae89f 100644 --- a/assets/resources/gui/element/herobox.prefab +++ b/assets/resources/gui/element/herobox.prefab @@ -8942,7 +8942,7 @@ "_lpos": { "__type__": "cc.Vec3", "x": 0, - "y": -20, + "y": 55, "z": 0 }, "_lrot": { @@ -8988,7 +8988,7 @@ "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, - "y": 0.5 + "y": 1 }, "_id": "" }, @@ -9015,12 +9015,12 @@ "_fontSize": 15, "_fontColor": { "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, + "r": 32, + "g": 32, + "b": 32, "a": 255 }, - "_maxWidth": 0, + "_maxWidth": 190, "_fontFamily": "Arial", "_font": null, "_isSystemFontUsed": true, diff --git a/assets/script/game/common/config/HeroSkillDesc.ts b/assets/script/game/common/config/HeroSkillDesc.ts index f5ff13cc..17c65025 100644 --- a/assets/script/game/common/config/HeroSkillDesc.ts +++ b/assets/script/game/common/config/HeroSkillDesc.ts @@ -30,7 +30,7 @@ */ import { HeroEvolve, SkillTriggerDesc, SkillTriggerType } from "./heroSet"; import { FieldSkillSet, mergeSkillParams, SkillConfig, SkillKind, SkillOverrides, SkillSet, TGroup } from "./SkillSet"; -import { SkillDescSet } from "./SkillDescSet"; +import { FieldDescSet, FieldValueFmt, SkillDescSet } from "./SkillDescSet"; import { BuffList } from "./BuffSet"; import { Attrs } from "./HeroAttrs"; @@ -82,8 +82,8 @@ const ATTR_NAME: Partial> = { [Attrs.hp_max]: "最大生命", }; -/** 富文本数值高亮色(项目色板:金色,与等级配色协调) */ -const RICH_VALUE_COLOR = "#F1C40F"; +/** 富文本数值高亮色(深绿色,与项目绿色系同源,深色面板上清晰可读) */ +const RICH_VALUE_COLOR = "#1E8449"; /** 解析目标描述文本(与战斗 SCastSystem 目标选取语义严格一致) */ function buildTargetDesc(skill: SkillConfig): string { @@ -182,6 +182,36 @@ function buildEffectLine(head: string, skill: SkillConfig): ISkillLine { return makeLine(head, rendered); } +/** + * 驻场光环(field)结构化行:查 FieldDescSet 按 type 渲染,value 实时取数值并高亮。 + * + * Why: FieldSkillConfig.info 是手写文案,改 value 易漂移。这里以 FieldSkillType + * 为 key 查标准动词,数值按 fmt(比例/整数/减免)从 value 实时渲染。 + */ +function buildFieldLine(head: string, uuid: number): ISkillLine | null { + const fs = FieldSkillSet[uuid]; + if (!fs) return null; + const desc = FieldDescSet[fs.type]; + // 未入表类型回退基础备注 info,整行不高亮 + if (!desc) return { prefix: `${head}${fs.name} ${fs.info}`, value: "", suffix: "" }; + + // 数值按格式渲染为高亮片段 + let valueText: string; + switch (desc.fmt) { + case FieldValueFmt.Percent: + valueText = `+${Math.round(fs.value * 100)}%`; + break; + case FieldValueFmt.IntMinus: + valueText = `-${fs.value}`; + break; + case FieldValueFmt.Int: + default: + valueText = `+${fs.value}`; + break; + } + return { prefix: `${head}${fs.name} ${desc.verb}`, value: valueText, suffix: "" }; +} + /** * 复活(revive)结构化行:复刻战斗公式,高亮复活次数与回血百分比 * 复活次数 = r_num + floor((lv - 1) * upr);回血百分比 = SkillSet[s_uuid].ap @@ -243,13 +273,13 @@ function buildSkillLines(source: ISkillDescSource): ISkillLine[] { } } - // ---- 驻场光环(field):读 FieldSkillSet 结构化 info,不抽数值 ---- + // ---- 驻场光环(field):查 FieldDescSet 结构化渲染,value 数值高亮 ---- const fieldUuids = source[SkillTriggerType.Field] as number[] | undefined; if (fieldUuids?.length) { const tpl = SkillTriggerDesc[SkillTriggerType.Field] ?? "场上存活"; for (const uuid of fieldUuids) { - const fs = FieldSkillSet[uuid]; - if (fs) lines.push({ prefix: `${tpl}:${fs.name} ${fs.info}`, value: "", suffix: "" }); + const line = buildFieldLine(`${tpl}:`, uuid); + if (line) lines.push(line); } } @@ -277,7 +307,7 @@ export function buildSkillDesc(source: ISkillDescSource): string { /** * 富文本描述(RichText 用,BBCode):数值用 高亮。 * @param source 触发技能数据源(同 buildSkillDesc) - * @returns 多行富文本串,数值片段包裹 ,用 \n 分隔 + * @returns 多行富文本串,数值片段包裹 ,用 \n 分隔 */ export function buildSkillDescRich(source: ISkillDescSource): string { return buildSkillLines(source) diff --git a/assets/script/game/common/config/SkillDescSet.ts b/assets/script/game/common/config/SkillDescSet.ts index 384d8162..d24844d8 100644 --- a/assets/script/game/common/config/SkillDescSet.ts +++ b/assets/script/game/common/config/SkillDescSet.ts @@ -22,7 +22,7 @@ * {verb} 效果动词(攻击力/暴击率/护盾…) * {dur} 持续时间秒数(计时模式用,取 buff_duration) */ -import { SkillOverrides } from "./SkillSet"; +import { FieldSkillType, SkillOverrides } from "./SkillSet"; /** * 单个技能的结构化描述配置 @@ -100,3 +100,51 @@ export const SkillDescSet: Record = { templPerm: "{target}以{value}%生命复活", }, }; + +/** + * 驻场光环数值格式:比例型(value 0.1 → +10%)或整数型(value 1 → +1) + */ +export enum FieldValueFmt { + /** 比例:value*100 取整 + "%"(如 0.1 → "+10%") */ + Percent = 1, + /** 整数:直接 +N(如 1 → "+1") */ + Int = 2, + /** 整数减:直接 -N(如 1 → "-1",用于费用减免) */ + IntMinus = 3, +} + +/** + * 单个驻场光环的结构化描述配置(文字表达标准层统一称谓) + */ +export interface FieldDescConfig { + /** 效果动词,如 "英雄攻击力"/"召唤触发技能次数" */ + verb: string; + /** 数值格式(决定 value 如何渲染为高亮片段) */ + fmt: FieldValueFmt; +} + +/** + * 驻场光环描述表,key = FieldSkillType。 + * 数值永远取 FieldSkillConfig.value 实时渲染,替代手写 info,杜绝漂移。 + */ +export const FieldDescSet: Record = { + [FieldSkillType.SummonCount]: { verb: "召唤触发技能次数", fmt: FieldValueFmt.Int }, + [FieldSkillType.DeadCount]: { verb: "死亡触发技能次数", fmt: FieldValueFmt.Int }, + [FieldSkillType.StartCount]: { verb: "战斗开始触发技能次数", fmt: FieldValueFmt.Int }, + [FieldSkillType.EndCount]: { verb: "战斗结束触发技能次数", fmt: FieldValueFmt.Int }, + [FieldSkillType.WaveGold]: { verb: "每回合金币收益", fmt: FieldValueFmt.Int }, + [FieldSkillType.SellGold]: { verb: "卖出英雄金币", fmt: FieldValueFmt.Int }, + [FieldSkillType.WaveHeal]: { verb: "战斗结束生命回复量", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroAtk]: { verb: "英雄攻击力", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroStun]: { verb: "英雄击晕概率", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroCrit]: { verb: "英雄暴击率", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroCritDamage]: { verb: "英雄暴击伤害", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroSpeed]: { verb: "英雄攻击速度", fmt: FieldValueFmt.Percent }, + [FieldSkillType.BuyDiscount]: { verb: "购买卡牌费用", fmt: FieldValueFmt.IntMinus }, + [FieldSkillType.RefreshDiscount]: { verb: "刷新卡牌费用", fmt: FieldValueFmt.IntMinus }, + [FieldSkillType.HeroHp]: { verb: "英雄最大生命", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroWindFury]: { verb: "英雄风怒概率", fmt: FieldValueFmt.Percent }, + [FieldSkillType.HeroPuncture]: { verb: "英雄穿刺概率", fmt: FieldValueFmt.Percent }, + [FieldSkillType.AtkCount]: { verb: "攻击触发技能次数", fmt: FieldValueFmt.Int }, + [FieldSkillType.BeAtkCount]: { verb: "被攻击触发技能次数", fmt: FieldValueFmt.Int }, +};