Files
Genarrative/packages/shared/src/contracts/bigFish.ts
2026-04-22 20:14:15 +08:00

191 lines
4.5 KiB
TypeScript

/**
* 大鱼吃小鱼玩法域前端共享契约。
* 字段与 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;
};