diff --git a/docs/qqbot-bangdream-tsugu-global-refactor-plan.md b/docs/qqbot-bangdream-tsugu-global-refactor-plan.md index 3c09539..72777d1 100644 --- a/docs/qqbot-bangdream-tsugu-global-refactor-plan.md +++ b/docs/qqbot-bangdream-tsugu-global-refactor-plan.md @@ -396,6 +396,7 @@ export interface TsuguHook { - 已新增 `render-blocks/list-card-prefix-spec.ts`,收口卡牌详情顶部标题块的画布、背景、乐队 Logo 等比缩放、卡牌标题和角色名文字布局;`list-card-prefix.ts` 改为消费 spec,乐队/角色/服务器优先级读取和绘制顺序保持不变;`list-card-prefix-spec.spec.ts` 覆盖标题块尺寸、背景、文字坐标和 Logo 缩放,本地 `/查卡 472` 图片 smoke 输出非空。 - 已新增 `render-blocks/list-stat-spec.ts`,收口卡牌/玩家综合力列表的间隔、数值行画布、文字规格、进度条布局和条宽算法;`list-stat.ts` 改为消费 spec,综合力计算、突破加成和绘制顺序保持不变;`list-stat-spec.spec.ts` 覆盖间隔/画布/文字/进度条规格、文本生成和条宽布局,本地 `/查卡 472` 图片 smoke 输出非空。 - 已新增 `render-blocks/title-spec.ts`,收口通用标题条的背景偏移、两行文字字号/行高/颜色/字体/坐标;`title.ts` 改为消费 spec,标题底图加载、标题文案和绘制顺序保持不变;`title-spec.spec.ts` 覆盖背景偏移、两行文字布局、绘制参数和坐标,本地 `/查卡 472` 图片 smoke 输出非空。 +- 已新增 `render-blocks/list-rarity-spec.ts`,收口星级列表的文字大小、间距和特训星图使用阈值;`list-rarity.ts` 改为消费 spec,星图资源加载、星级数量和列表绘制顺序保持不变;`list-rarity-spec.spec.ts` 覆盖列表规格和 3/4/5 星及未特训边界,本地 `/查卡 472` 图片 smoke 输出非空。 - smoke/Jenkins/远程调试卡点继续按已固化规则处理:同一卡点第二次尝试前必须改变可验证变量;Jenkins 查询 URL 含方括号时用 `curl -g` 或改查 Jenkins home;线上图片 smoke 必须查询 `commandId`、拉回图片、展示图片、查日志并清理本轮临时目录;PowerShell 双引号 here-string 中不要写 JS `${...}` 模板字面量,避免被 PowerShell 提前插值;smoke 没有真实图片落盘时必须失败。 ### Phase 6:策略 policy 和时间/档线规则 diff --git a/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity-spec.ts b/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity-spec.ts new file mode 100644 index 0000000..5ba8e26 --- /dev/null +++ b/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity-spec.ts @@ -0,0 +1,24 @@ +export const BANGDREAM_RARITY_LIST_SPEC = { + list: { + spacing: 0, + textSize: 50, + }, + trainedStar: { + minRarity: 4, + }, +} as const; + +/** + * 判断星级列表是否使用特训后星图。 + * + * @param rarity - 卡牌稀有度。 + * @param trainingStatus - 是否展示特训后状态。 + */ +export function shouldUseTrainedRarityStar( + rarity: number, + trainingStatus: boolean, +) { + return ( + rarity >= BANGDREAM_RARITY_LIST_SPEC.trainedStar.minRarity && trainingStatus + ); +} diff --git a/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity.ts b/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity.ts index 49902c0..5fd1ae7 100644 --- a/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity.ts +++ b/src/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity.ts @@ -2,6 +2,10 @@ import { Canvas, Image } from 'skia-canvas'; import { drawList } from './list-frame'; import { loadImageFromPath } from '@/qqbot/plugins/bangDream/tsugu/canvas/image-utils'; import { getBangDreamAssetPath } from '@/qqbot/plugins/bangDream/tsugu/runtime/asset-manifest'; +import { + BANGDREAM_RARITY_LIST_SPEC, + shouldUseTrainedRarityStar, +} from '@/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity-spec'; interface RarityInListOptions { key?: string; @@ -36,7 +40,7 @@ export async function drawRarityInList({ }: RarityInListOptions): Promise { const content: Array = []; let star: Image; - if (rarity > 3 && trainingStatus) { + if (shouldUseTrainedRarityStar(rarity, trainingStatus)) { star = starList.trained; } else { star = starList.normal; @@ -50,8 +54,8 @@ export async function drawRarityInList({ const canvas = drawList({ key, content: content, - textSize: 50, - spacing: 0, + textSize: BANGDREAM_RARITY_LIST_SPEC.list.textSize, + spacing: BANGDREAM_RARITY_LIST_SPEC.list.spacing, }); return canvas; } diff --git a/test/qqbot/plugins/bangDream/tsugu/list-rarity-spec.spec.ts b/test/qqbot/plugins/bangDream/tsugu/list-rarity-spec.spec.ts new file mode 100644 index 0000000..b926370 --- /dev/null +++ b/test/qqbot/plugins/bangDream/tsugu/list-rarity-spec.spec.ts @@ -0,0 +1,21 @@ +import { + BANGDREAM_RARITY_LIST_SPEC, + shouldUseTrainedRarityStar, +} from '@/qqbot/plugins/bangDream/tsugu/render-blocks/list-rarity-spec'; + +describe('BangDream rarity list spec', () => { + it('keeps the historical rarity list text size and spacing stable', () => { + expect(BANGDREAM_RARITY_LIST_SPEC.list).toEqual({ + spacing: 0, + textSize: 50, + }); + }); + + it('keeps the trained star threshold stable', () => { + expect(BANGDREAM_RARITY_LIST_SPEC.trainedStar.minRarity).toBe(4); + expect(shouldUseTrainedRarityStar(3, true)).toBe(false); + expect(shouldUseTrainedRarityStar(4, true)).toBe(true); + expect(shouldUseTrainedRarityStar(5, true)).toBe(true); + expect(shouldUseTrainedRarityStar(4, false)).toBe(false); + }); +});