/** * 大鱼吃小鱼玩法域前端共享契约。 * 字段与 server-rs/shared-contracts/src/big_fish.rs 保持 camelCase 对齐。 */ export type CreateBigFishSessionRequest = { seedText?: string; }; export type SendBigFishMessageRequest = { clientMessageId: string; text: string; }; export type BigFishActionId = | 'big_fish_compile_draft' | 'big_fish_generate_level_main_image' | 'big_fish_generate_level_motion' | 'big_fish_generate_stage_background' | 'big_fish_publish_game'; export type ExecuteBigFishActionRequest = { action: BigFishActionId; level?: number; motionKey?: 'idle_float' | 'move_swim' | string; }; export type SubmitBigFishInputRequest = { x: number; y: number; }; export type BigFishAnchorStatus = | 'confirmed' | 'inferred' | 'missing' | 'locked' | string; export type BigFishAnchorItemResponse = { key: string; label: string; value: string; status: BigFishAnchorStatus; }; export type BigFishAnchorPackResponse = { gameplayPromise: BigFishAnchorItemResponse; ecologyVisualTheme: BigFishAnchorItemResponse; growthLadder: BigFishAnchorItemResponse; riskTempo: BigFishAnchorItemResponse; }; export type BigFishLevelBlueprintResponse = { level: number; name: string; oneLineFantasy: string; silhouetteDirection: string; sizeRatio: number; visualPromptSeed: string; motionPromptSeed: string; mergeSourceLevel?: number | null; preyWindow: number[]; threatWindow: number[]; isFinalLevel: boolean; }; export type BigFishBackgroundBlueprintResponse = { theme: string; colorMood: string; foregroundHints: string; midgroundComposition: string; backgroundDepth: string; safePlayAreaHint: string; spawnEdgeHint: string; backgroundPromptSeed: string; }; export type BigFishRuntimeParamsResponse = { levelCount: number; mergeCountPerUpgrade: number; spawnTargetCount: number; leaderMoveSpeed: number; followerCatchUpSpeed: number; offscreenCullSeconds: number; preySpawnDeltaLevels: number[]; threatSpawnDeltaLevels: number[]; winLevel: number; }; export type BigFishGameDraftResponse = { title: string; subtitle: string; coreFun: string; ecologyTheme: string; levels: BigFishLevelBlueprintResponse[]; background: BigFishBackgroundBlueprintResponse; runtimeParams: BigFishRuntimeParamsResponse; }; export type BigFishAgentMessageResponse = { id: string; role: 'user' | 'assistant' | string; kind: 'chat' | 'system' | 'warning' | string; text: string; createdAt: string; }; export type BigFishAssetKind = | 'level_main_image' | 'level_motion' | 'stage_background' | string; export type BigFishAssetStatus = 'empty' | 'ready' | 'generating' | string; export type BigFishAssetSlotResponse = { slotId: string; assetKind: BigFishAssetKind; level?: number | null; motionKey?: string | null; status: BigFishAssetStatus; assetUrl?: string | null; promptSnapshot: string; updatedAt: string; }; export type BigFishAssetCoverageResponse = { levelMainImageReadyCount: number; levelMotionReadyCount: number; backgroundReady: boolean; requiredLevelCount: number; publishReady: boolean; blockers: string[]; }; export type BigFishSessionSnapshotResponse = { sessionId: string; currentTurn: number; progressPercent: number; stage: string; anchorPack: BigFishAnchorPackResponse; draft?: BigFishGameDraftResponse | null; assetSlots: BigFishAssetSlotResponse[]; assetCoverage: BigFishAssetCoverageResponse; messages: BigFishAgentMessageResponse[]; lastAssistantReply?: string | null; publishReady: boolean; updatedAt: string; }; export type BigFishSessionResponse = { session: BigFishSessionSnapshotResponse; }; export type BigFishActionResponse = { session: BigFishSessionSnapshotResponse; }; export type BigFishVector2Response = { x: number; y: number; }; export type BigFishRuntimeEntityResponse = { entityId: string; level: number; position: BigFishVector2Response; radius: number; offscreenSeconds: number; }; export type BigFishRuntimeSnapshotResponse = { runId: string; sessionId: string; status: 'running' | 'won' | 'failed' | string; tick: number; playerLevel: number; winLevel: number; leaderEntityId?: string | null; ownedEntities: BigFishRuntimeEntityResponse[]; wildEntities: BigFishRuntimeEntityResponse[]; cameraCenter: BigFishVector2Response; lastInput: BigFishVector2Response; eventLog: string[]; updatedAt: string; }; export type BigFishRunResponse = { run: BigFishRuntimeSnapshotResponse; };