//! 大鱼吃小鱼领域模型。 //! //! 保留创作会话、资产槽、发布门禁和运行态聚合的纯领域结构;图片生成、OSS 与 HTTP handler 均留在 adapter 层。 use serde::{Deserialize, Serialize}; #[cfg(feature = "spacetime-types")] use spacetimedb::SpacetimeType; pub const BIG_FISH_SESSION_ID_PREFIX: &str = "big-fish-session-"; pub const BIG_FISH_MESSAGE_ID_PREFIX: &str = "big-fish-message-"; pub const BIG_FISH_OPERATION_ID_PREFIX: &str = "big-fish-operation-"; pub const BIG_FISH_ASSET_SLOT_ID_PREFIX: &str = "big-fish-asset-"; pub const PUBLIC_BIG_FISH_GALLERY_OWNER_USER_ID: &str = "public-big-fish-gallery"; pub const BIG_FISH_DEFAULT_LEVEL_COUNT: u32 = 8; pub const BIG_FISH_MIN_LEVEL_COUNT: u32 = 6; pub const BIG_FISH_MAX_LEVEL_COUNT: u32 = 12; pub const BIG_FISH_MERGE_COUNT_PER_UPGRADE: u32 = 3; pub const BIG_FISH_OFFSCREEN_CULL_SECONDS: f32 = 3.0; pub const BIG_FISH_TARGET_WILD_COUNT: usize = 12; #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishCreationStage { CollectingAnchors, DraftReady, AssetRefining, ReadyToPublish, Published, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishAnchorStatus { Confirmed, Inferred, Missing, Locked, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishAgentMessageRole { User, Assistant, System, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishAgentMessageKind { Chat, Summary, ActionResult, Warning, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishAssetKind { LevelMainImage, LevelMotion, StageBackground, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishAssetStatus { Missing, Ready, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishAnchorItem { pub key: String, pub label: String, pub value: String, pub status: BigFishAnchorStatus, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishAnchorPack { pub gameplay_promise: BigFishAnchorItem, pub ecology_visual_theme: BigFishAnchorItem, pub growth_ladder: BigFishAnchorItem, pub risk_tempo: BigFishAnchorItem, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishLevelBlueprint { pub level: u32, pub name: String, pub one_line_fantasy: String, pub text_description: String, pub silhouette_direction: String, pub size_ratio: f32, pub visual_description: String, pub visual_prompt_seed: String, pub idle_motion_description: String, pub move_motion_description: String, pub motion_prompt_seed: String, pub merge_source_level: Option, pub prey_window: Vec, pub threat_window: Vec, pub is_final_level: bool, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishBackgroundBlueprint { pub theme: String, pub color_mood: String, pub foreground_hints: String, pub midground_composition: String, pub background_depth: String, pub safe_play_area_hint: String, pub spawn_edge_hint: String, pub background_prompt_seed: String, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishRuntimeParams { pub level_count: u32, pub merge_count_per_upgrade: u32, pub spawn_target_count: u32, pub leader_move_speed: f32, pub follower_catch_up_speed: f32, pub offscreen_cull_seconds: f32, pub prey_spawn_delta_levels: Vec, pub threat_spawn_delta_levels: Vec, pub win_level: u32, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishGameDraft { pub title: String, pub subtitle: String, pub core_fun: String, pub ecology_theme: String, pub levels: Vec, pub background: BigFishBackgroundBlueprint, pub runtime_params: BigFishRuntimeParams, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishAgentMessageSnapshot { pub message_id: String, pub session_id: String, pub role: BigFishAgentMessageRole, pub kind: BigFishAgentMessageKind, pub text: String, pub created_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishAssetSlotSnapshot { pub slot_id: String, pub session_id: String, pub asset_kind: BigFishAssetKind, pub level: Option, pub motion_key: Option, pub status: BigFishAssetStatus, pub asset_url: Option, pub prompt_snapshot: String, pub updated_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishAssetCoverage { pub level_main_image_ready_count: u32, pub level_motion_ready_count: u32, pub background_ready: bool, pub required_level_count: u32, pub publish_ready: bool, pub blockers: Vec, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishSessionSnapshot { pub session_id: String, pub owner_user_id: String, pub seed_text: String, pub current_turn: u32, pub progress_percent: u32, pub stage: BigFishCreationStage, pub anchor_pack: BigFishAnchorPack, pub draft: Option, pub asset_slots: Vec, pub asset_coverage: BigFishAssetCoverage, pub messages: Vec, pub last_assistant_reply: Option, pub publish_ready: bool, pub created_at_micros: i64, pub updated_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishSessionProcedureResult { pub ok: bool, pub session: Option, pub error_message: Option, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BigFishWorkSummarySnapshot { pub work_id: String, pub source_session_id: String, pub owner_user_id: String, pub title: String, pub subtitle: String, pub summary: String, pub cover_image_src: Option, pub status: String, pub updated_at_micros: i64, pub publish_ready: bool, pub level_count: u32, pub level_main_image_ready_count: u32, pub level_motion_ready_count: u32, pub background_ready: bool, pub play_count: u32, pub remix_count: u32, pub like_count: u32, #[serde(default)] pub recent_play_count_7d: u32, pub published_at_micros: Option, } /// 发布门禁的领域判定结果。 /// /// 这里不保存外部任务状态,只表达当前聚合快照是否满足发布条件。 #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishPublishReadiness { pub session_id: String, pub owner_user_id: String, pub publish_ready: bool, pub blockers: Vec, pub evaluated_at_micros: i64, } /// 运行态一局的状态。 #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum BigFishRunStatus { Running, Won, Failed, } /// 运行态二维坐标。 #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishVector2 { pub x: f32, pub y: f32, } /// 运行态实体快照。 /// /// 只表达服务端结算后的事实,前端不能据此反推规则并本地裁决。 #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishRuntimeEntitySnapshot { pub entity_id: String, pub level: u32, pub position: BigFishVector2, pub radius: f32, pub offscreen_seconds: f32, } /// 运行态一局快照。 #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct BigFishRuntimeSnapshot { pub run_id: String, pub session_id: String, pub status: BigFishRunStatus, pub tick: u64, pub player_level: u32, pub win_level: u32, pub leader_entity_id: Option, pub owned_entities: Vec, pub wild_entities: Vec, pub camera_center: BigFishVector2, pub last_input: BigFishVector2, pub event_log: Vec, pub updated_at_micros: i64, } impl BigFishRunStatus { pub fn as_str(self) -> &'static str { match self { Self::Running => "running", Self::Won => "won", Self::Failed => "failed", } } } impl BigFishCreationStage { pub fn as_str(self) -> &'static str { match self { Self::CollectingAnchors => "collecting_anchors", Self::DraftReady => "draft_ready", Self::AssetRefining => "asset_refining", Self::ReadyToPublish => "ready_to_publish", Self::Published => "published", } } } impl BigFishAnchorStatus { pub fn as_str(self) -> &'static str { match self { Self::Confirmed => "confirmed", Self::Inferred => "inferred", Self::Missing => "missing", Self::Locked => "locked", } } } impl BigFishAgentMessageRole { pub fn as_str(self) -> &'static str { match self { Self::User => "user", Self::Assistant => "assistant", Self::System => "system", } } } impl BigFishAgentMessageKind { pub fn as_str(self) -> &'static str { match self { Self::Chat => "chat", Self::Summary => "summary", Self::ActionResult => "action_result", Self::Warning => "warning", } } } impl BigFishAssetKind { pub fn as_str(self) -> &'static str { match self { Self::LevelMainImage => "level_main_image", Self::LevelMotion => "level_motion", Self::StageBackground => "stage_background", } } } impl BigFishAssetStatus { pub fn as_str(self) -> &'static str { match self { Self::Missing => "missing", Self::Ready => "ready", } } }