Expand campaign visual assets

This commit is contained in:
2026-06-25 10:52:16 +09:00
parent 30291fe0fa
commit 03ca89e03f
18 changed files with 254 additions and 300 deletions

View File

@@ -0,0 +1,69 @@
const portraitModules = import.meta.glob('../../assets/images/portraits/*.png', {
eager: true,
import: 'default'
}) as Record<string, string>;
const legacyPortraitSlugs: Record<string, string> = {
liuBei: 'liu-bei',
guanYu: 'guan-yu',
zhangFei: 'zhang-fei',
zhugeLiang: 'zhuge-liang',
zhaoYun: 'zhao-yun',
jiangWei: 'jiang-wei',
simaYi: 'sima-yi'
};
const speakerPortraitKeys: Record<string, string> = {
: 'liuBei',
: 'guanYu',
: 'zhangFei',
: 'zhugeLiang',
: 'zhaoYun',
: 'jiangWei',
: 'simaYi',
: 'mi-zhu',
: 'jian-yong',
: 'sun-qian',
: 'ma-liang',
: 'pang-tong',
: 'fa-zheng',
: 'huang-zhong',
: 'wei-yan',
: 'ma-chao',
: 'ma-dai',
: 'wang-ping',
: 'li-yan',
: 'wu-yi',
: 'yi-ji',
: 'gong-zhi',
: 'huang-quan',
: 'meng-huo',
: 'zhou-yu',
: 'cao-cao'
};
function fileSlugFromPath(path: string) {
const fileName = path.split('/').pop() ?? path;
return fileName.replace(/\.png$/i, '');
}
function camelToKebab(value: string) {
return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
}
export const portraitAssets: Record<string, string> = Object.fromEntries(
Object.entries(portraitModules).map(([path, url]) => [fileSlugFromPath(path), url])
);
export function portraitSlugForKey(key: string) {
return legacyPortraitSlugs[key] ?? camelToKebab(key);
}
export function portraitTextureKey(key: string) {
const slug = portraitSlugForKey(key);
return portraitAssets[slug] ? `portrait-${slug}` : undefined;
}
export function portraitKeyForSpeaker(speaker?: string) {
return speaker ? speakerPortraitKeys[speaker] : undefined;
}