Merge remote-tracking branch 'origin/server_node'
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-08 19:16:55 +08:00
69 changed files with 8262 additions and 81 deletions

View File

@@ -9,16 +9,21 @@ import {
upsertSavedCustomWorldProfile,
} from '../../data/customWorldLibrary';
import { resolveCustomWorldCampSceneImage } from '../../data/customWorldVisuals';
import { getScenePreset } from '../../data/scenePresets';
import {
type CustomWorldGenerationProgress,
generateCustomWorldProfile,
} from '../../services/ai';
} from '../../services/aiService';
import {
buildCustomWorldCreatorIntentDisplayText,
buildCustomWorldCreatorIntentGenerationText,
createEmptyCustomWorldCreatorIntent,
} from '../../services/customWorldCreatorIntent';
import { detectCustomWorldThemeMode } from '../../services/customWorldTheme';
import {
listCustomWorldLibrary,
upsertCustomWorldProfile,
} from '../../services/storageService';
import {
type CustomWorldCreatorIntent,
type CustomWorldGenerationMode,
@@ -141,7 +146,7 @@ export function PreGameSelectionFlow({
useState<GameState['customWorldProfile']>(null);
const [savedCustomWorldProfiles, setSavedCustomWorldProfiles] = useState<
CustomWorldProfile[]
>(() => readSavedCustomWorldProfiles());
>([]);
const [showDeveloperTeamModal, setShowDeveloperTeamModal] = useState(false);
const [showCustomWorldModal, setShowCustomWorldModal] = useState(false);
const [customWorldCreatorIntent, setCustomWorldCreatorIntent] =
@@ -217,6 +222,25 @@ export function PreGameSelectionFlow({
},
[],
);
useEffect(() => {
let isActive = true;
void listCustomWorldLibrary()
.then((profiles) => {
if (!isActive) return;
setSavedCustomWorldProfiles(profiles);
})
.catch((error) => {
console.warn(
'[PreGameSelectionFlow] failed to load custom world library',
error,
);
});
return () => {
isActive = false;
};
}, []);
const leaveCustomWorldResult = () => {
setGeneratedCustomWorldProfile(null);
@@ -268,18 +292,18 @@ export function PreGameSelectionFlow({
setShowCustomWorldModal(true);
};
const saveGeneratedCustomWorld = () => {
const saveGeneratedCustomWorld = async () => {
if (!generatedCustomWorldProfile) {
return;
}
try {
setSavedCustomWorldProfiles(
upsertSavedCustomWorldProfile(generatedCustomWorldProfile),
await upsertCustomWorldProfile(generatedCustomWorldProfile),
);
} catch (error) {
setCustomWorldError(
error instanceof Error ? error.message : '本地保存自定义世界失败。',
error instanceof Error ? error.message : '保存自定义世界失败。',
);
return;
}
@@ -446,7 +470,7 @@ export function PreGameSelectionFlow({
id: generatedCustomWorldProfile.id,
}
: profile;
const savedProfiles = upsertSavedCustomWorldProfile(persistedProfile);
const savedProfiles = await upsertCustomWorldProfile(persistedProfile);
setSavedCustomWorldProfiles(savedProfiles);
setGeneratedCustomWorldProfile(null);
setCustomWorldError(null);
@@ -760,7 +784,24 @@ export function PreGameSelectionFlow({
onContinueExpand={() => {
void continueExpandCustomWorld();
}}
onSave={saveGeneratedCustomWorld}
onRegeneratePlayableNpc={(id) => {
void regeneratePlayableNpc(id);
}}
onRegenerateStoryNpc={(id) => {
void regenerateStoryNpc(id);
}}
onRegenerateLandmark={(id) => {
void regenerateLandmark(id);
}}
onRegenerateStoryExpansion={() => {
void regenerateStoryExpansion();
}}
onRegenerateLandmarkNetwork={() => {
void regenerateLandmarkNetwork();
}}
onSave={() => {
void saveGeneratedCustomWorld();
}}
/>
</motion.div>
)}