refactor(skilldesc): 重构技能描述渲染逻辑,统一驻场光环展示
1. 调整英雄头像预制体的UI布局参数与文字颜色样式 2. 新增驻场光环描述配置表,标准化光环效果的文字与数值渲染 3. 重构技能描述生成逻辑,使用实时数值替代手写文案避免数值漂移 4. 修改富文本高亮色为深绿色以适配深色面板
This commit is contained in:
@@ -8942,7 +8942,7 @@
|
|||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": -20,
|
"y": 55,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"_lrot": {
|
"_lrot": {
|
||||||
@@ -8988,7 +8988,7 @@
|
|||||||
"_anchorPoint": {
|
"_anchorPoint": {
|
||||||
"__type__": "cc.Vec2",
|
"__type__": "cc.Vec2",
|
||||||
"x": 0.5,
|
"x": 0.5,
|
||||||
"y": 0.5
|
"y": 1
|
||||||
},
|
},
|
||||||
"_id": ""
|
"_id": ""
|
||||||
},
|
},
|
||||||
@@ -9015,12 +9015,12 @@
|
|||||||
"_fontSize": 15,
|
"_fontSize": 15,
|
||||||
"_fontColor": {
|
"_fontColor": {
|
||||||
"__type__": "cc.Color",
|
"__type__": "cc.Color",
|
||||||
"r": 255,
|
"r": 32,
|
||||||
"g": 255,
|
"g": 32,
|
||||||
"b": 255,
|
"b": 32,
|
||||||
"a": 255
|
"a": 255
|
||||||
},
|
},
|
||||||
"_maxWidth": 0,
|
"_maxWidth": 190,
|
||||||
"_fontFamily": "Arial",
|
"_fontFamily": "Arial",
|
||||||
"_font": null,
|
"_font": null,
|
||||||
"_isSystemFontUsed": true,
|
"_isSystemFontUsed": true,
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
import { HeroEvolve, SkillTriggerDesc, SkillTriggerType } from "./heroSet";
|
import { HeroEvolve, SkillTriggerDesc, SkillTriggerType } from "./heroSet";
|
||||||
import { FieldSkillSet, mergeSkillParams, SkillConfig, SkillKind, SkillOverrides, SkillSet, TGroup } from "./SkillSet";
|
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 { BuffList } from "./BuffSet";
|
||||||
import { Attrs } from "./HeroAttrs";
|
import { Attrs } from "./HeroAttrs";
|
||||||
|
|
||||||
@@ -82,8 +82,8 @@ const ATTR_NAME: Partial<Record<Attrs, string>> = {
|
|||||||
[Attrs.hp_max]: "最大生命",
|
[Attrs.hp_max]: "最大生命",
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 富文本数值高亮色(项目色板:金色,与等级配色协调) */
|
/** 富文本数值高亮色(深绿色,与项目绿色系同源,深色面板上清晰可读) */
|
||||||
const RICH_VALUE_COLOR = "#F1C40F";
|
const RICH_VALUE_COLOR = "#1E8449";
|
||||||
|
|
||||||
/** 解析目标描述文本(与战斗 SCastSystem 目标选取语义严格一致) */
|
/** 解析目标描述文本(与战斗 SCastSystem 目标选取语义严格一致) */
|
||||||
function buildTargetDesc(skill: SkillConfig): string {
|
function buildTargetDesc(skill: SkillConfig): string {
|
||||||
@@ -182,6 +182,36 @@ function buildEffectLine(head: string, skill: SkillConfig): ISkillLine {
|
|||||||
return makeLine(head, rendered);
|
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)结构化行:复刻战斗公式,高亮复活次数与回血百分比
|
* 复活(revive)结构化行:复刻战斗公式,高亮复活次数与回血百分比
|
||||||
* 复活次数 = r_num + floor((lv - 1) * upr);回血百分比 = SkillSet[s_uuid].ap
|
* 复活次数 = 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;
|
const fieldUuids = source[SkillTriggerType.Field] as number[] | undefined;
|
||||||
if (fieldUuids?.length) {
|
if (fieldUuids?.length) {
|
||||||
const tpl = SkillTriggerDesc[SkillTriggerType.Field] ?? "场上存活";
|
const tpl = SkillTriggerDesc[SkillTriggerType.Field] ?? "场上存活";
|
||||||
for (const uuid of fieldUuids) {
|
for (const uuid of fieldUuids) {
|
||||||
const fs = FieldSkillSet[uuid];
|
const line = buildFieldLine(`${tpl}:`, uuid);
|
||||||
if (fs) lines.push({ prefix: `${tpl}:${fs.name} ${fs.info}`, value: "", suffix: "" });
|
if (line) lines.push(line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +307,7 @@ export function buildSkillDesc(source: ISkillDescSource): string {
|
|||||||
/**
|
/**
|
||||||
* 富文本描述(RichText 用,BBCode):数值用 <color> 高亮。
|
* 富文本描述(RichText 用,BBCode):数值用 <color> 高亮。
|
||||||
* @param source 触发技能数据源(同 buildSkillDesc)
|
* @param source 触发技能数据源(同 buildSkillDesc)
|
||||||
* @returns 多行富文本串,数值片段包裹 <color=#F1C40F>,用 \n 分隔
|
* @returns 多行富文本串,数值片段包裹 <color=#1E8449>,用 \n 分隔
|
||||||
*/
|
*/
|
||||||
export function buildSkillDescRich(source: ISkillDescSource): string {
|
export function buildSkillDescRich(source: ISkillDescSource): string {
|
||||||
return buildSkillLines(source)
|
return buildSkillLines(source)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
* {verb} 效果动词(攻击力/暴击率/护盾…)
|
* {verb} 效果动词(攻击力/暴击率/护盾…)
|
||||||
* {dur} 持续时间秒数(计时模式用,取 buff_duration)
|
* {dur} 持续时间秒数(计时模式用,取 buff_duration)
|
||||||
*/
|
*/
|
||||||
import { SkillOverrides } from "./SkillSet";
|
import { FieldSkillType, SkillOverrides } from "./SkillSet";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单个技能的结构化描述配置
|
* 单个技能的结构化描述配置
|
||||||
@@ -100,3 +100,51 @@ export const SkillDescSet: Record<number, SkillDescConfig> = {
|
|||||||
templPerm: "{target}以{value}%生命复活",
|
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<number, FieldDescConfig> = {
|
||||||
|
[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 },
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user