71 lines
1.8 KiB
TypeScript
71 lines
1.8 KiB
TypeScript
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),
|
||
),
|
||
];
|
||
}
|