1
This commit is contained in:
@@ -71,6 +71,67 @@ export function createEmptyStoryEngineMemoryState(): StoryEngineMemoryState {
|
||||
};
|
||||
}
|
||||
|
||||
export function normalizeStoryEngineMemoryState(
|
||||
memory?: Partial<StoryEngineMemoryState> | null,
|
||||
): StoryEngineMemoryState {
|
||||
const empty = createEmptyStoryEngineMemoryState();
|
||||
if (!memory) return empty;
|
||||
|
||||
// 后端投影或旧存档可能只带增量字段,前端消费前统一补齐数组字段。
|
||||
return {
|
||||
...empty,
|
||||
...memory,
|
||||
discoveredFactIds: Array.isArray(memory.discoveredFactIds)
|
||||
? memory.discoveredFactIds
|
||||
: empty.discoveredFactIds,
|
||||
inferredFactIds: Array.isArray(memory.inferredFactIds)
|
||||
? memory.inferredFactIds
|
||||
: empty.inferredFactIds,
|
||||
activeThreadIds: Array.isArray(memory.activeThreadIds)
|
||||
? memory.activeThreadIds
|
||||
: empty.activeThreadIds,
|
||||
resolvedScarIds: Array.isArray(memory.resolvedScarIds)
|
||||
? memory.resolvedScarIds
|
||||
: empty.resolvedScarIds,
|
||||
recentCarrierIds: Array.isArray(memory.recentCarrierIds)
|
||||
? memory.recentCarrierIds
|
||||
: empty.recentCarrierIds,
|
||||
openedSceneChapterIds: Array.isArray(memory.openedSceneChapterIds)
|
||||
? memory.openedSceneChapterIds
|
||||
: empty.openedSceneChapterIds,
|
||||
recentSignalIds: Array.isArray(memory.recentSignalIds)
|
||||
? memory.recentSignalIds
|
||||
: empty.recentSignalIds,
|
||||
recentCompanionReactions: Array.isArray(memory.recentCompanionReactions)
|
||||
? memory.recentCompanionReactions
|
||||
: empty.recentCompanionReactions,
|
||||
companionArcStates: Array.isArray(memory.companionArcStates)
|
||||
? memory.companionArcStates
|
||||
: empty.companionArcStates,
|
||||
worldMutations: Array.isArray(memory.worldMutations)
|
||||
? memory.worldMutations
|
||||
: empty.worldMutations,
|
||||
chronicle: Array.isArray(memory.chronicle)
|
||||
? memory.chronicle
|
||||
: empty.chronicle,
|
||||
factionTensionStates: Array.isArray(memory.factionTensionStates)
|
||||
? memory.factionTensionStates
|
||||
: empty.factionTensionStates,
|
||||
consequenceLedger: Array.isArray(memory.consequenceLedger)
|
||||
? memory.consequenceLedger
|
||||
: empty.consequenceLedger,
|
||||
companionResolutions: Array.isArray(memory.companionResolutions)
|
||||
? memory.companionResolutions
|
||||
: empty.companionResolutions,
|
||||
narrativeCodex: Array.isArray(memory.narrativeCodex)
|
||||
? memory.narrativeCodex
|
||||
: empty.narrativeCodex,
|
||||
simulationRunResults: Array.isArray(memory.simulationRunResults)
|
||||
? memory.simulationRunResults
|
||||
: empty.simulationRunResults,
|
||||
};
|
||||
}
|
||||
|
||||
function buildBaseFactIds(
|
||||
narrativeProfile?: ActorNarrativeProfile | null,
|
||||
backstoryReveal?: CharacterBackstoryRevealConfig | null,
|
||||
@@ -113,7 +174,7 @@ function resolveUnlockedChapterIds(
|
||||
export function buildEncounterVisibilitySlice(
|
||||
params: EncounterVisibilityParams,
|
||||
) {
|
||||
const memory = params.storyEngineMemory ?? createEmptyStoryEngineMemoryState();
|
||||
const memory = normalizeStoryEngineMemoryState(params.storyEngineMemory);
|
||||
const factIds = buildBaseFactIds(params.narrativeProfile, params.backstoryReveal);
|
||||
const unlockedChapterIds = resolveUnlockedChapterIds(
|
||||
params.backstoryReveal,
|
||||
@@ -193,7 +254,7 @@ export function buildEncounterVisibilitySlice(
|
||||
export function buildQuestVisibilitySlice(
|
||||
params: QuestVisibilityParams,
|
||||
) {
|
||||
const memory = params.storyEngineMemory ?? createEmptyStoryEngineMemoryState();
|
||||
const memory = normalizeStoryEngineMemoryState(params.storyEngineMemory);
|
||||
const narrativeProfile = params.issuerNarrativeProfile;
|
||||
const factIds = dedupeStrings([
|
||||
narrativeProfile ? 'publicMask' : null,
|
||||
|
||||
Reference in New Issue
Block a user