refactor(heroDesc): 统一英雄技能描述文案生成逻辑

1.  将原英雄卡片手写的复活/重生描述统一改为通过buildSkillDescMoreRich生成
2.  新增buildHeroDescSource方法构造1级技能描述数据源,保证与英雄信息弹窗文案一致
3.  修正多处技能描述文本,将复活统一改为重生并补充回合重生次数说明
4.  将开局类buff描述改为回合开始,匹配实际生效时机
This commit is contained in:
panFD
2026-08-09 17:14:46 +08:00
parent c59ba45b5b
commit b098db849b
4 changed files with 478 additions and 958 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -579,11 +579,11 @@ export function buildSkillDescMoreRich(source: ISkillDescSource): string {
}
}
// 复活revive
// 重生revive:每回合拥有 N 次重生机会,死亡后以 X% 血量原地重生
const revive = resolveReviveByLv(source[SkillTriggerType.Revive] as LvReviveEntry[] | undefined, lv);
if (revive) {
const reviveName = getTriggerSkillName(SkillTriggerType.Revive, revive.s_uuid);
lines.push(`「<color=${RICH_NAME_COLOR}>${reviveName}</color>」: 死亡后以<color=${RICH_VALUE_COLOR}>${Math.round(revive.upr * 100)}%</color>血量复活<color=${RICH_VALUE_COLOR}>${revive.r_num}</color>次`);
lines.push(`「<color=${RICH_NAME_COLOR}>${reviveName}</color>」: 每回合拥有<color=${RICH_VALUE_COLOR}>${revive.r_num}</color>次重生机会,死亡后以<color=${RICH_VALUE_COLOR}>${Math.round(revive.upr * 100)}%</color>血量原地重生`);
}
return lines.join("\n");

View File

@@ -654,7 +654,7 @@ export const HeroInfo: Record<number, heroInfo> = {
{ lv: 3, s_uuid: 6501, r_num: 1, upr: 0.6 },
{ lv: 5, s_uuid: 6501, r_num: 1, upr: 0.7 },
],
info: "<color=#27AE60>✧</color>死亡全队攻血提升\n<color=#9B59B6>✦</color>死亡后原地复活",
info: "<color=#27AE60>✧</color>死亡全队攻血提升\n<color=#9B59B6>✦</color>死亡后原地重生",
},
5043: {
uuid: 5043, name: "亡魂刺客", path: "hc1", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, hp: 900, ap: 85,
@@ -717,7 +717,7 @@ export const HeroInfo: Record<number, heroInfo> = {
{ lv: 1, s_uuid: 6501, r_num: 1, upr: 0.5 },
{ lv: 3, s_uuid: 6501, r_num: 1, upr: 0.6 },
],
info: "<color=#27AE60>✧</color>死亡全队加护盾\n<color=#27AE60>✧</color>复活1:50%血量",
info: "<color=#27AE60>✧</color>死亡全队加护盾\n<color=#27AE60>✧</color>重生每回合可重生1次复50%血量",
},
// ========== fstart 类(法师 · 战前增益) ==========
@@ -734,7 +734,7 @@ export const HeroInfo: Record<number, heroInfo> = {
],
},
hp_bonus: [{ lv: 2, value: 80 }, { lv: 4, value: 80 }],
info: "<color=#27AE60>✧</color>开局全队提升攻击",
info: "<color=#27AE60>✧</color>回合开始全队提升攻击",
},
5052: {
uuid: 5052, name: "护盾牧师", path: "hm2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, hp: 287, ap: 80,
@@ -751,7 +751,7 @@ export const HeroInfo: Record<number, heroInfo> = {
],
},
hp_bonus: [{ lv: 3, value: 80 }],
info: "<color=#27AE60>✧</color>开局全队获得护盾",
info: "<color=#27AE60>✧</color>回合开始全队获得护盾",
},
// 5052: {
// uuid: 5052, name: "护盾牧师", path: "hm2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, hp: 287, ap: 80,

View File

@@ -21,6 +21,7 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { CardConfig, CardType } from "../common/config/CardSet";
import { HeroInfo } from "../common/config/heroSet";
import { buildSkillDescMoreRich, ISkillDescSource } from "../common/config/HeroSkillDesc";
import { oops } from "db://oops-framework/core/Oops";
import { GameEvent } from "../common/config/GameEvent";
import { outlineRich } from "../common/RichOutline";
@@ -284,10 +285,11 @@ export class CHeroComp extends CCComp {
// 背景:按 card_lv 激活对应颜色子节点1→green 2→blue 3→purple 4→red 5→yellow
this.updateBgNode();
// 描述富文本:直接取 heroSet 的 info 字段(单条手写文案
// 描述富文本:不再单独手写 info统一套用英雄 1 级能力介绍buildSkillDescMoreRich
// 与英雄信息弹窗/升级确认框同一套文案规则,杜绝手写文案与数值漂移
// outlineRich 为整段富文本包裹描边,提升深色面板可读性
if (this.info_rich) {
const desc = hero?.info || this.cardData.info || "";
const desc = hero ? buildSkillDescMoreRich(this.buildHeroDescSource(hero)) : (this.cardData.info || "");
this.info_rich.string = outlineRich(desc);
this.info_rich.node.active = !!desc;
}
@@ -464,6 +466,26 @@ export class CHeroComp extends CCComp {
return model.hero_uuid ?? null;
}
/**
* 构造英雄 1 级能力描述数据源ISkillDescSource
* lv 恒为 1由各 resolver 取 1 级生效档,与英雄信息弹窗初始展示口径一致。
* @param hero HeroInfo 静态配置项
* @returns 描述数据源
*/
private buildHeroDescSource(hero: typeof HeroInfo[number]): ISkillDescSource {
return {
lv: 1,
call: hero.call,
dead: hero.dead,
fstart: hero.fstart,
fend: hero.fend,
atking: hero.atking,
atked: hero.atked,
field: hero.field,
revive: hero.revive,
};
}
/**
* 为英雄图标加载 idle 动画剪辑,提取首帧 SpriteFrame 静止展示。
* 与 HInfoComp 的 updateHeroAnimation 一致,零运行时开销。