Implement scene-based chapter quest progression
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-08 11:58:47 +08:00
parent 9d2fc9e4b8
commit bd9fdcbe31
170 changed files with 18259 additions and 1049 deletions

View File

@@ -0,0 +1,120 @@
import { parseApiErrorMessage } from '../editor/shared/jsonClient';
const QWEN_SPRITE_MASTER_API_PATH = '/api/qwen-sprite/master';
const QWEN_SPRITE_SHEET_API_PATH = '/api/qwen-sprite/sheet';
const QWEN_SPRITE_FRAME_REPAIR_API_PATH = '/api/qwen-sprite/frame-repair';
const QWEN_SPRITE_SAVE_API_PATH = '/api/qwen-sprite/save';
export type QwenSpriteImageDraft = {
id: string;
label: string;
imageSrc: string;
remoteUrl?: string;
};
export type GenerateQwenSpritePayload = {
promptText: string;
negativePrompt: string;
model: string;
size: string;
promptExtend: boolean;
candidateCount: number;
seed?: number;
referenceImages: string[];
};
export type RepairQwenSpriteFramePayload = {
promptText: string;
negativePrompt: string;
model: string;
size: string;
promptExtend: boolean;
seed?: number;
referenceImages: string[];
};
export type SaveQwenSpriteAssetPayload = {
assetKey: string;
actionKey: string;
masterSource: string;
sheetSource: string;
framesDataUrls: string[];
metadata: Record<string, unknown>;
prompts: Record<string, unknown>;
};
async function postJson<T>(
url: string,
payload: Record<string, unknown>,
fallbackMessage: string,
) {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
const responseText = await response.text();
if (!response.ok) {
throw new Error(parseApiErrorMessage(responseText, fallbackMessage));
}
return JSON.parse(responseText) as T;
}
export async function generateQwenSpriteMaster(
payload: GenerateQwenSpritePayload,
) {
return postJson<{
ok: true;
draftId: string;
drafts: QwenSpriteImageDraft[];
model: string;
size: string;
promptText: string;
negativePrompt: string;
}>(QWEN_SPRITE_MASTER_API_PATH, payload, '生成主图失败');
}
export async function generateQwenSpriteSheet(
payload: GenerateQwenSpritePayload,
) {
return postJson<{
ok: true;
draftId: string;
drafts: QwenSpriteImageDraft[];
model: string;
size: string;
promptText: string;
negativePrompt: string;
}>(QWEN_SPRITE_SHEET_API_PATH, payload, '生成精灵表失败');
}
export async function repairQwenSpriteFrame(
payload: RepairQwenSpriteFramePayload,
) {
return postJson<{
ok: true;
draftId: string;
drafts: QwenSpriteImageDraft[];
repairedFrame: QwenSpriteImageDraft | null;
model: string;
size: string;
promptText: string;
negativePrompt: string;
}>(QWEN_SPRITE_FRAME_REPAIR_API_PATH, payload, '修复帧失败');
}
export async function saveQwenSpriteAsset(
payload: SaveQwenSpriteAssetPayload,
) {
return postJson<{
ok: true;
assetId: string;
assetDir: string;
masterImagePath: string | null;
sheetImagePath: string;
framePaths: string[];
saveMessage: string;
}>(QWEN_SPRITE_SAVE_API_PATH, payload, '保存精灵表失败');
}