Update Match3D/image-generation docs & code

Adds/updates documentation, assets and implementation for Match3D and puzzle image generation workflows. Key changes: decision logs and pitfalls updated to prefer VectorEngine Gemini for Match3D material sheets and to require edits (multipart) for 1:1 container reference images; guidance added for when to use APIMart vs VectorEngine. .env.example clarified APIMart/Responses config. Many new public assets and PPT visuals added. Code changes across frontend and backend: updated shared contracts, server-rs match3d/puzzle/image-generation handlers, VectorEngine/OpenAI image generation clients, and multiple React components/tests to handle UI/background/container image signing, edits workflow, and puzzle UI background resolution. Added src/services/puzzle-runtime/puzzleUiBackgroundSource.ts and related test updates. Includes notes about multipart HTTP/1.1 requirement and test/verification commands in docs.
This commit is contained in:
2026-05-14 20:34:45 +08:00
parent d33c937ebc
commit 548db78ca7
103 changed files with 6687 additions and 3270 deletions

View File

@@ -179,24 +179,24 @@ fn seed_creation_entry_config_if_missing(ctx: &ReducerContext) {
}
}
migrate_visual_novel_entry_from_old_open_default(ctx, now);
migrate_visual_novel_entry_from_old_visible_default(ctx, now);
}
fn migrate_visual_novel_entry_from_old_open_default(ctx: &ReducerContext, now: Timestamp) {
fn migrate_visual_novel_entry_from_old_visible_default(ctx: &ReducerContext, now: Timestamp) {
let id = "visual-novel".to_string();
let Some(row) = ctx.db.creation_entry_type_config().id().find(&id) else {
return;
};
// 中文注释:只纠偏默认种子,不覆盖后台入口开关里后续手动调整的视觉小说配置。
let still_old_default = row.title == "视觉小说"
// 中文注释:只纠偏历史默认种子,不覆盖后台入口开关里后续手动调整的视觉小说配置。
let still_old_visible_default = row.title == "视觉小说"
&& row.subtitle == "分支叙事体验"
&& row.badge == "可创建"
&& row.image_src == "/creation-type-references/visual-novel.webp"
&& row.visible
&& row.open
&& ((row.badge == "可创建" && row.open)
|| (row.badge == "敬请期待" && !row.open))
&& row.sort_order == 60;
if !still_old_default {
if !still_old_visible_default {
return;
}
@@ -205,6 +205,7 @@ fn migrate_visual_novel_entry_from_old_open_default(ctx: &ReducerContext, now: T
.id()
.update(CreationEntryTypeConfig {
badge: "敬请期待".to_string(),
visible: false,
open: false,
updated_at: now,
..row
@@ -274,7 +275,7 @@ fn default_creation_entry_type_configs(now: Timestamp) -> Vec<CreationEntryTypeC
"分支叙事体验",
"敬请期待",
"/creation-type-references/visual-novel.webp",
true,
false,
false,
60,
now,