This commit is contained in:
2026-05-01 00:33:39 +08:00
parent 61969c5116
commit fe02603ba1
68 changed files with 4586 additions and 748 deletions

View File

@@ -1,4 +1,5 @@
import type { BigFishWorkSummary } from '../../../packages/shared/src/contracts/bigFishWorkSummary';
import type { PuzzleDraftLevel } from '../../../packages/shared/src/contracts/puzzleAgentDraft';
import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary';
import type {
CustomWorldGalleryCard,
@@ -32,6 +33,7 @@ export type PlatformPuzzleGalleryCard = {
subtitle: string;
summaryText: string;
coverImageSrc: string | null;
coverSlides?: PlatformPuzzleCoverSlide[];
themeTags: string[];
playCount?: number;
remixCount?: number;
@@ -42,6 +44,12 @@ export type PlatformPuzzleGalleryCard = {
updatedAt: string;
};
export type PlatformPuzzleCoverSlide = {
id: string;
imageSrc: string;
label: string;
};
export type PlatformBigFishGalleryCard = {
sourceType: 'big-fish';
workId: string;
@@ -100,6 +108,7 @@ export function mapPuzzleWorkToPlatformGalleryCard(
subtitle: '拼图关卡',
summaryText: work.workDescription || work.summary,
coverImageSrc: work.coverImageSrc,
coverSlides: buildPuzzleWorkCoverSlides(work),
themeTags: work.themeTags,
playCount: work.playCount ?? 0,
remixCount: work.remixCount ?? 0,
@@ -160,6 +169,89 @@ export function resolvePlatformWorldCoverImage(entry: PlatformWorldCardLike) {
return '';
}
export function resolvePlatformWorldCoverSlides(
entry: PlatformWorldCardLike,
): PlatformPuzzleCoverSlide[] {
const fallbackCoverImage = resolvePlatformWorldCoverImage(entry).trim();
const puzzleCoverSlides = isPuzzleGalleryEntry(entry)
? (entry.coverSlides ?? [])
: [];
const normalizedSlides = puzzleCoverSlides
.map((slide, index) => ({
id: slide.id.trim() || `cover-${index + 1}`,
imageSrc: slide.imageSrc.trim(),
label: slide.label.trim() || entry.worldName,
}))
.filter((slide) => Boolean(slide.imageSrc));
if (normalizedSlides.length > 0) {
return normalizedSlides;
}
return fallbackCoverImage
? [
{
id: 'cover',
imageSrc: fallbackCoverImage,
label: entry.worldName,
},
]
: [];
}
export function resolvePuzzleLevelFormalImageSrc(level: PuzzleDraftLevel) {
const selectedCandidate =
level.candidates.find(
(candidate) =>
candidate.selected ||
(level.selectedCandidateId
? candidate.candidateId === level.selectedCandidateId
: false),
) ??
level.candidates[level.candidates.length - 1] ??
null;
return (
selectedCandidate?.imageSrc?.trim() || level.coverImageSrc?.trim() || ''
);
}
export function buildPuzzleWorkCoverSlides(
work: PuzzleWorkSummary,
): PlatformPuzzleCoverSlide[] {
const slides: PlatformPuzzleCoverSlide[] = [];
const usedImageSrcSet = new Set<string>();
work.levels?.forEach((level, index) => {
const imageSrc = resolvePuzzleLevelFormalImageSrc(level);
if (!imageSrc || usedImageSrcSet.has(imageSrc)) {
return;
}
usedImageSrcSet.add(imageSrc);
slides.push({
id: level.levelId?.trim() || `puzzle-level-${index + 1}`,
imageSrc,
label: level.levelName?.trim() || `${index + 1}`,
});
});
if (slides.length > 0) {
return slides;
}
const fallbackImageSrc = work.coverImageSrc?.trim() ?? '';
return fallbackImageSrc
? [
{
id: 'cover',
imageSrc: fallbackImageSrc,
label: work.levelName,
},
]
: [];
}
export function resolvePlatformWorldLeadPortrait(entry: PlatformWorldCardLike) {
if (!isLibraryWorldEntry(entry)) {
return '';