Merge branch 'master' of http://82.157.175.59:3000/GenarrativeAI/Genarrative
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-05-05 14:58:07 +08:00
238 changed files with 29234 additions and 144 deletions

View File

@@ -82,6 +82,7 @@ import {
isBigFishGalleryEntry,
isMatch3DGalleryEntry,
isPuzzleGalleryEntry,
isSquareHoleGalleryEntry,
type PlatformPublicGalleryCard,
type PlatformWorldCardLike,
resolvePlatformWorldCoverImage,
@@ -1134,7 +1135,9 @@ function buildPublicGalleryCardKey(entry: PlatformPublicGalleryCard) {
? 'puzzle'
: isMatch3DGalleryEntry(entry)
? 'match3d'
: 'rpg';
: isSquareHoleGalleryEntry(entry)
? 'square-hole'
: 'rpg';
return `${kind}:${entry.ownerUserId}:${entry.profileId}`;
}
@@ -1242,7 +1245,9 @@ function describePublicGalleryCardKind(entry: PlatformPublicGalleryCard) {
? '拼图'
: isMatch3DGalleryEntry(entry)
? '抓鹅'
: describePlatformThemeLabel(entry.themeMode);
: isSquareHoleGalleryEntry(entry)
? '方洞'
: describePlatformThemeLabel(entry.themeMode);
return formatPlatformWorkDisplayTag(kind);
}
@@ -1514,6 +1519,12 @@ function formatPlayedWorkType(value: string | null | undefined) {
if (normalizedValue === 'puzzle') {
return '拼图';
}
if (normalizedValue === 'match3d' || normalizedValue === 'match_3d') {
return '抓鹅';
}
if (normalizedValue === 'square-hole' || normalizedValue === 'square_hole') {
return '方洞';
}
if (normalizedValue === 'big_fish' || normalizedValue === 'big-fish') {
return '大鱼';
}

View File

@@ -2,6 +2,7 @@ import type { BigFishWorkSummary } from '../../../packages/shared/src/contracts/
import type { Match3DWorkSummary } from '../../../packages/shared/src/contracts/match3dWorks';
import type { PuzzleDraftLevel } from '../../../packages/shared/src/contracts/puzzleAgentDraft';
import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary';
import type { SquareHoleWorkSummary } from '../../../packages/shared/src/contracts/squareHoleWorks';
import type {
CustomWorldGalleryCard,
CustomWorldLibraryEntry,
@@ -12,6 +13,7 @@ import {
buildBigFishPublicWorkCode,
buildMatch3DPublicWorkCode,
buildPuzzlePublicWorkCode,
buildSquareHolePublicWorkCode,
} from '../../services/publicWorkCode';
import type { CustomWorldProfile } from '../../types';
@@ -23,6 +25,7 @@ export type PlatformWorldCardLike =
| CustomWorldLibraryEntry<CustomWorldProfile>
| PlatformBigFishGalleryCard
| PlatformMatch3DGalleryCard
| PlatformSquareHoleGalleryCard
| PlatformPuzzleGalleryCard;
export type PlatformPuzzleGalleryCard = {
@@ -97,10 +100,33 @@ export type PlatformMatch3DGalleryCard = {
updatedAt: string;
};
export type PlatformSquareHoleGalleryCard = {
sourceType: 'square-hole';
workId: string;
profileId: string;
sourceSessionId?: string | null;
publicWorkCode: string;
ownerUserId: string;
authorDisplayName: string;
worldName: string;
subtitle: string;
summaryText: string;
coverImageSrc: string | null;
themeTags: string[];
playCount?: number;
remixCount?: number;
likeCount?: number;
recentPlayCount7d?: number;
visibility: 'published';
publishedAt: string | null;
updatedAt: string;
};
export type PlatformPublicGalleryCard =
| CustomWorldGalleryCard
| PlatformBigFishGalleryCard
| PlatformMatch3DGalleryCard
| PlatformSquareHoleGalleryCard
| PlatformPuzzleGalleryCard;
export function isLibraryWorldEntry(
@@ -127,6 +153,12 @@ export function isMatch3DGalleryEntry(
return 'sourceType' in entry && entry.sourceType === 'match3d';
}
export function isSquareHoleGalleryEntry(
entry: PlatformWorldCardLike,
): entry is PlatformSquareHoleGalleryCard {
return 'sourceType' in entry && entry.sourceType === 'square-hole';
}
export function mapPuzzleWorkToPlatformGalleryCard(
work: PuzzleWorkSummary,
): PlatformPuzzleGalleryCard {
@@ -180,6 +212,33 @@ export function mapMatch3DWorkToPlatformGalleryCard(
};
}
export function mapSquareHoleWorkToPlatformGalleryCard(
work: SquareHoleWorkSummary,
): PlatformSquareHoleGalleryCard {
return {
sourceType: 'square-hole',
workId: work.workId,
profileId: work.profileId,
sourceSessionId: work.sourceSessionId ?? null,
publicWorkCode: buildSquareHolePublicWorkCode(work.profileId),
ownerUserId: work.ownerUserId,
authorDisplayName: '玩家',
worldName: work.gameName,
subtitle: '反直觉形状分拣',
summaryText: work.summary,
coverImageSrc: work.coverImageSrc ?? null,
themeTags:
work.tags.length > 0 ? work.tags : [work.themeText, '方洞挑战'],
playCount: work.playCount ?? 0,
remixCount: 0,
likeCount: 0,
recentPlayCount7d: 0,
visibility: 'published',
publishedAt: work.publishedAt ?? null,
updatedAt: work.updatedAt,
};
}
export function mapBigFishWorkToPlatformGalleryCard(
work: BigFishWorkSummary,
): PlatformBigFishGalleryCard {
@@ -371,6 +430,12 @@ export function buildPlatformWorldTags(entry: PlatformWorldCardLike) {
return entry.themeTags.length > 0 ? entry.themeTags.slice(0, 3) : ['抓大鹅'];
}
if (isSquareHoleGalleryEntry(entry)) {
return entry.themeTags.length > 0
? entry.themeTags.slice(0, 3)
: ['方洞'];
}
if (!isLibraryWorldEntry(entry)) {
return [
describePlatformThemeLabel(entry.themeMode),
@@ -449,6 +514,10 @@ export function resolvePlatformPublicWorkCode(
return entry.publicWorkCode;
}
if (isSquareHoleGalleryEntry(entry)) {
return entry.publicWorkCode;
}
return entry.publicWorkCode;
}