This commit is contained in:
2026-04-27 22:50:18 +08:00
parent ded6f6ee2a
commit b6c6640548
77 changed files with 5240 additions and 833 deletions

View File

@@ -8,6 +8,7 @@ import type {
SceneConnectionInfo,
StoryEngineMemoryState,
} from '../types';
import { resolveCustomWorldRoleIdReferences } from './customWorldRoleReferences';
function toSet(values: string[]) {
return new Set(values.map((value) => value.trim()).filter(Boolean));
@@ -227,17 +228,11 @@ export function resolveActiveSceneActEncounterNpcIds(params: {
return [];
}
return [
...new Set(
[
activeAct.primaryNpcId,
activeAct.oppositeNpcId,
...activeAct.encounterNpcIds,
]
.map((entry) => entry.trim())
.filter(Boolean),
),
];
return resolveCustomWorldRoleIdReferences(params.profile, [
activeAct.primaryNpcId,
activeAct.oppositeNpcId,
...activeAct.encounterNpcIds,
]);
}
export function resolveActiveSceneActPrimaryNpcId(params: {
@@ -245,7 +240,9 @@ export function resolveActiveSceneActPrimaryNpcId(params: {
sceneId: string | null | undefined;
storyEngineMemory?: StoryEngineMemoryState | null;
}) {
return resolveActiveSceneActBlueprint(params)?.primaryNpcId?.trim() || null;
return resolveCustomWorldRoleIdReferences(params.profile, [
resolveActiveSceneActBlueprint(params)?.primaryNpcId,
])[0] ?? null;
}
export function resolveActiveSceneActOppositeNpcId(params: {
@@ -253,7 +250,9 @@ export function resolveActiveSceneActOppositeNpcId(params: {
sceneId: string | null | undefined;
storyEngineMemory?: StoryEngineMemoryState | null;
}) {
return resolveActiveSceneActBlueprint(params)?.oppositeNpcId?.trim() || null;
return resolveCustomWorldRoleIdReferences(params.profile, [
resolveActiveSceneActBlueprint(params)?.oppositeNpcId,
])[0] ?? null;
}
export function resolveActiveSceneActEncounterFocusNpcId(params: {
@@ -262,12 +261,11 @@ export function resolveActiveSceneActEncounterFocusNpcId(params: {
storyEngineMemory?: StoryEngineMemoryState | null;
}) {
const activeAct = resolveActiveSceneActBlueprint(params);
return (
activeAct?.oppositeNpcId?.trim() ||
activeAct?.primaryNpcId?.trim() ||
activeAct?.encounterNpcIds[0]?.trim() ||
null
);
return resolveCustomWorldRoleIdReferences(params.profile, [
activeAct?.oppositeNpcId,
activeAct?.primaryNpcId,
activeAct?.encounterNpcIds[0],
])[0] ?? null;
}
export function resolveActiveSceneActBackgroundImage(params: {
@@ -295,13 +293,18 @@ export function canUseLimitedPrimaryNpcChat(params: {
storyEngineMemory: params.storyEngineMemory,
});
const limitedChatNpcIds = toSet([
activeAct?.primaryNpcId ?? '',
activeAct?.oppositeNpcId ?? '',
]);
const limitedChatNpcIds = toSet(
resolveCustomWorldRoleIdReferences(params.profile, [
activeAct?.primaryNpcId,
activeAct?.oppositeNpcId,
]),
);
const normalizedNpcId =
resolveCustomWorldRoleIdReferences(params.profile, [params.npcId])[0] ??
params.npcId;
// 中文注释:第一幕对面角色即使是负好感,也必须先进入剧情对话;普通敌人仍按战斗处理。
if (limitedChatNpcIds.has(params.npcId)) {
if (limitedChatNpcIds.has(normalizedNpcId)) {
return true;
}
@@ -310,7 +313,7 @@ export function canUseLimitedPrimaryNpcChat(params: {
profile: params.profile,
sceneId: params.sceneId,
storyEngineMemory: params.storyEngineMemory,
}) === params.npcId
}) === normalizedNpcId
);
}