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

@@ -0,0 +1,70 @@
import type {
CustomWorldRoleProfile,
} from '../types';
type CustomWorldRoleReferenceProfile = {
playableNpcs: CustomWorldRoleProfile[];
storyNpcs: CustomWorldRoleProfile[];
};
function normalizeRoleReference(value: string | null | undefined) {
return (value ?? '')
.trim()
.replace(/^character-npc[-:]/i, '')
.replace(/^(playable|story|role|npc)[-_:]/i, '')
.replace(/\s+/g, '')
.replace(/[(].*?[)]/g, '');
}
function getRoleReferenceAliases(role: CustomWorldRoleProfile) {
return [
role.id,
role.name,
role.title,
`${role.name}${role.title}`,
`${role.title}${role.name}`,
`${role.role}${role.name}`,
`${role.name}${role.role}`,
]
.map(normalizeRoleReference)
.filter(Boolean);
}
export function findCustomWorldRoleByReference(
profile: CustomWorldRoleReferenceProfile | null | undefined,
reference: string | null | undefined,
) {
const normalizedReference = normalizeRoleReference(reference);
if (!profile || !normalizedReference) {
return null;
}
const roles = [...profile.storyNpcs, ...profile.playableNpcs];
return (
roles.find((role) =>
getRoleReferenceAliases(role).includes(normalizedReference),
) ?? null
);
}
export function resolveCustomWorldRoleIdReference(
profile: CustomWorldRoleReferenceProfile | null | undefined,
reference: string | null | undefined,
) {
const role = findCustomWorldRoleByReference(profile, reference);
return role?.id ?? reference?.trim() ?? '';
}
export function resolveCustomWorldRoleIdReferences(
profile: CustomWorldRoleReferenceProfile | null | undefined,
references: Array<string | null | undefined>,
) {
return [
...new Set(
references
.map((reference) => resolveCustomWorldRoleIdReference(profile, reference))
.map((reference) => reference.trim())
.filter(Boolean),
),
];
}