feat: refine wooden fish runtime generation

This commit is contained in:
2026-05-22 03:49:35 +08:00
parent d81cc49549
commit 5f1128540e
30 changed files with 804 additions and 126 deletions

View File

@@ -1265,6 +1265,14 @@ fn normalize_migration_row(table_name: &str, value: &serde_json::Value) -> serde
.or_insert(serde_json::Value::Null);
}
}
if table_name == "wooden_fish_work_profile" {
if let Some(object) = next_value.as_object_mut() {
// 中文注释:敲木鱼背景环境图晚于首版作品表加入,旧迁移包按未生成背景兼容。
object
.entry("background_asset_json".to_string())
.or_insert(serde_json::Value::Null);
}
}
next_value
}

View File

@@ -81,6 +81,7 @@ pub struct WoodenFishGalleryViewRow {
pub hit_object_reference_image_src: Option<String>,
pub hit_sound_prompt: Option<String>,
pub hit_object_asset: Option<WoodenFishImageAssetSnapshot>,
pub background_asset: Option<WoodenFishImageAssetSnapshot>,
pub hit_sound_asset: Option<WoodenFishAudioAssetSnapshot>,
pub floating_words: Vec<String>,
pub cover_image_src: String,
@@ -327,6 +328,11 @@ fn compile_wooden_fish_draft_tx(
.as_deref()
.map(parse_json)
.transpose()?;
let background_asset = input
.background_asset_json
.as_deref()
.map(parse_json)
.transpose()?;
let cover_image_src = input
.cover_image_src
.as_deref()
@@ -354,6 +360,7 @@ fn compile_wooden_fish_draft_tx(
hit_sound_prompt: input.hit_sound_prompt.as_deref().and_then(clean_optional),
floating_words: floating_words.clone(),
hit_object_asset: hit_object_asset.clone(),
background_asset: background_asset.clone(),
hit_sound_asset: hit_sound_asset.clone(),
cover_image_src: cover_image_src.clone(),
generation_status: input
@@ -392,6 +399,7 @@ fn compile_wooden_fish_draft_tx(
play_count: 0,
updated_at: compiled_at,
published_at: None,
background_asset_json: background_asset.as_ref().map(to_json_string),
};
upsert_work(ctx, row);
let config = config_from_draft(&draft);
@@ -469,6 +477,14 @@ fn update_wooden_fish_work_tx(
let asset = parse_json::<WoodenFishAudioAssetSnapshot>(&value)?;
next.hit_sound_asset_json = to_json_string(&asset);
}
if let Some(value) = input
.background_asset_json
.as_deref()
.and_then(clean_optional)
{
let asset = parse_json::<WoodenFishImageAssetSnapshot>(&value)?;
next.background_asset_json = Some(to_json_string(&asset));
}
if let Some(value) = input
.floating_words_json
.as_deref()
@@ -674,6 +690,7 @@ fn build_gallery_view_row(
hit_object_reference_image_src: work.hit_object_reference_image_src,
hit_sound_prompt: work.hit_sound_prompt,
hit_object_asset: work.hit_object_asset,
background_asset: work.background_asset,
hit_sound_asset: work.hit_sound_asset,
floating_words: work.floating_words,
cover_image_src: work.cover_image_src,
@@ -721,6 +738,12 @@ fn build_work_snapshot(row: &WoodenFishWorkProfileRow) -> Result<WoodenFishWorkS
hit_object_asset: clean_optional(&row.hit_object_asset_json)
.map(|value| parse_json(&value))
.transpose()?,
background_asset: row
.background_asset_json
.as_deref()
.and_then(clean_optional)
.map(|value| parse_json(&value))
.transpose()?,
hit_sound_asset: clean_optional(&row.hit_sound_asset_json)
.map(|value| parse_json(&value))
.transpose()?,
@@ -965,6 +988,11 @@ fn insert_event(
fn is_publish_ready(row: &WoodenFishWorkProfileRow) -> bool {
!row.work_title.trim().is_empty()
&& !row.hit_object_asset_json.trim().is_empty()
&& row
.background_asset_json
.as_deref()
.and_then(clean_optional)
.is_some()
&& !row.hit_sound_asset_json.trim().is_empty()
&& !row.floating_words_json.trim().is_empty()
&& row.generation_status == WOODEN_FISH_GENERATION_READY
@@ -1002,6 +1030,7 @@ fn draft_from_config(
hit_sound_prompt: config.hit_sound_prompt.clone(),
floating_words: normalize_floating_words(&config.floating_words),
hit_object_asset: None,
background_asset: None,
hit_sound_asset: None,
cover_image_src: None,
generation_status: generation_status.to_string(),
@@ -1021,6 +1050,7 @@ fn draft_from_work_snapshot(work: &WoodenFishWorkSnapshot) -> WoodenFishDraftSna
hit_sound_prompt: work.hit_sound_prompt.clone(),
floating_words: work.floating_words.clone(),
hit_object_asset: work.hit_object_asset.clone(),
background_asset: work.background_asset.clone(),
hit_sound_asset: work.hit_sound_asset.clone(),
cover_image_src: clean_optional(&work.cover_image_src),
generation_status: work.generation_status.clone(),
@@ -1199,6 +1229,7 @@ fn clone_work(row: &WoodenFishWorkProfileRow) -> WoodenFishWorkProfileRow {
hit_object_reference_image_src: row.hit_object_reference_image_src.clone(),
hit_sound_prompt: row.hit_sound_prompt.clone(),
hit_object_asset_json: row.hit_object_asset_json.clone(),
background_asset_json: row.background_asset_json.clone(),
hit_sound_asset_json: row.hit_sound_asset_json.clone(),
floating_words_json: row.floating_words_json.clone(),
cover_image_src: row.cover_image_src.clone(),

View File

@@ -45,6 +45,8 @@ pub struct WoodenFishWorkProfileRow {
pub(crate) play_count: u32,
pub(crate) updated_at: Timestamp,
pub(crate) published_at: Option<Timestamp>,
#[default(None::<String>)]
pub(crate) background_asset_json: Option<String>,
}
#[spacetimedb::table(

View File

@@ -45,6 +45,7 @@ pub struct WoodenFishDraftCompileInput {
pub hit_object_reference_image_src: Option<String>,
pub hit_sound_prompt: Option<String>,
pub hit_object_asset_json: Option<String>,
pub background_asset_json: Option<String>,
pub hit_sound_asset_json: Option<String>,
pub floating_words_json: Option<String>,
pub cover_image_src: Option<String>,
@@ -63,6 +64,7 @@ pub struct WoodenFishWorkUpdateInput {
pub hit_object_reference_image_src: Option<String>,
pub hit_sound_prompt: Option<String>,
pub hit_object_asset_json: Option<String>,
pub background_asset_json: Option<String>,
pub hit_sound_asset_json: Option<String>,
pub floating_words_json: Option<String>,
pub cover_image_src: Option<String>,
@@ -207,6 +209,7 @@ pub struct WoodenFishDraftSnapshot {
pub hit_sound_prompt: Option<String>,
pub floating_words: Vec<String>,
pub hit_object_asset: Option<WoodenFishImageAssetSnapshot>,
pub background_asset: Option<WoodenFishImageAssetSnapshot>,
pub hit_sound_asset: Option<WoodenFishAudioAssetSnapshot>,
pub cover_image_src: Option<String>,
pub generation_status: String,
@@ -242,6 +245,7 @@ pub struct WoodenFishWorkSnapshot {
pub hit_object_reference_image_src: Option<String>,
pub hit_sound_prompt: Option<String>,
pub hit_object_asset: Option<WoodenFishImageAssetSnapshot>,
pub background_asset: Option<WoodenFishImageAssetSnapshot>,
pub hit_sound_asset: Option<WoodenFishAudioAssetSnapshot>,
pub floating_words: Vec<String>,
pub cover_image_src: String,