import type { CustomWorldGalleryCard, CustomWorldLibraryEntry, } from '../../../packages/shared/src/contracts/runtime'; import { buildCustomWorldPlayableCharacters } from '../../data/characterPresets'; import { resolveCustomWorldCampSceneImage } from '../../data/customWorldVisuals'; import type { CustomWorldProfile } from '../../types'; export type PlatformWorldCardLike = | CustomWorldGalleryCard | CustomWorldLibraryEntry; export function isLibraryWorldEntry( entry: PlatformWorldCardLike, ): entry is CustomWorldLibraryEntry { return 'profile' in entry; } export function resolvePlatformWorldCoverImage(entry: PlatformWorldCardLike) { if (entry.coverImageSrc) { return entry.coverImageSrc; } if (isLibraryWorldEntry(entry)) { return resolveCustomWorldCampSceneImage(entry.profile) ?? ''; } return ''; } export function resolvePlatformWorldLeadPortrait( entry: PlatformWorldCardLike, ) { if (!isLibraryWorldEntry(entry)) { return ''; } return buildCustomWorldPlayableCharacters(entry.profile)[0]?.portrait ?? ''; } export function buildPlatformWorldTags(entry: PlatformWorldCardLike) { if (!isLibraryWorldEntry(entry)) { return [ describePlatformThemeLabel(entry.themeMode), `${entry.playableNpcCount} 角色`, `${entry.landmarkCount} 地标`, ]; } return [ ...entry.profile.majorFactions.slice(0, 2), ...entry.profile.coreConflicts.slice(0, 1), ] .map((value) => value.trim()) .filter(Boolean) .slice(0, 3); } export function formatPlatformWorldTime(value: string | null) { if (!value) { return '未发布'; } const date = new Date(value); if (Number.isNaN(date.getTime())) { return value; } return date.toLocaleDateString('zh-CN', { month: '2-digit', day: '2-digit', }); } export function describePlatformThemeLabel(themeMode: PlatformWorldCardLike['themeMode']) { switch (themeMode) { case 'martial': return '江湖'; case 'arcane': return '灵脉'; case 'machina': return '机巧'; case 'tide': return '潮痕'; case 'rift': return '裂界'; default: return '回响'; } }