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, ) { return [ ...new Set( references .map((reference) => resolveCustomWorldRoleIdReference(profile, reference)) .map((reference) => reference.trim()) .filter(Boolean), ), ]; }