Files
Genarrative/src/services/customWorldTheme.ts
kdletters cbc27bad4a
Some checks failed
CI / verify (push) Has been cancelled
init with react+axum+spacetimedb
2026-04-26 18:06:23 +08:00

110 lines
3.3 KiB
TypeScript

import { CustomWorldProfile, WorldTemplateType, WorldType } from '../types';
export type CustomWorldThemeMode =
| 'martial'
| 'arcane'
| 'machina'
| 'tide'
| 'rift'
| 'mythic';
export function detectCustomWorldThemeMode(
profile: Pick<
CustomWorldProfile,
| 'settingText'
| 'summary'
| 'tone'
| 'playerGoal'
| 'templateWorldType'
| 'compatibilityTemplateWorldType'
| 'ownedSettingLayers'
>,
): CustomWorldThemeMode {
const semanticAnchor = profile.ownedSettingLayers?.semanticAnchor;
const expressionProfile = profile.ownedSettingLayers?.expressionProfile;
const source = [
profile.settingText,
profile.summary,
profile.tone,
profile.playerGoal,
...(semanticAnchor?.genreSignals ?? []),
...(semanticAnchor?.conflictForms ?? []),
...(semanticAnchor?.institutionTypes ?? []),
...(semanticAnchor?.tabooTypes ?? []),
...(semanticAnchor?.carrierTypes ?? []),
...(semanticAnchor?.forceSystemTypes ?? []),
...(semanticAnchor?.atmosphereTags ?? []),
...(expressionProfile?.presentationTone ?? []),
].join(' ');
if (/[齿]/u.test(source)) return 'machina';
if (/[]/u.test(source)) return 'tide';
if (/[线]/u.test(source)) return 'rift';
if (/[]/u.test(source)) return 'arcane';
if (/[]/u.test(source)) return 'martial';
return 'mythic';
}
export function resolveCustomWorldCompatibilityTemplateWorldType(
profile: Pick<
CustomWorldProfile,
| 'templateWorldType'
| 'compatibilityTemplateWorldType'
| 'ownedSettingLayers'
> &
Partial<
Pick<
CustomWorldProfile,
'settingText' | 'summary' | 'tone' | 'playerGoal'
>
>,
): WorldTemplateType {
if (
profile.compatibilityTemplateWorldType === WorldType.WUXIA ||
profile.compatibilityTemplateWorldType === WorldType.XIANXIA
) {
return profile.compatibilityTemplateWorldType;
}
const compatibilityTemplateWorldType =
profile.ownedSettingLayers?.compatibilityProfile?.compatibilityTemplateWorldType;
if (
compatibilityTemplateWorldType === WorldType.WUXIA ||
compatibilityTemplateWorldType === WorldType.XIANXIA
) {
return compatibilityTemplateWorldType;
}
const legacyTemplateWorldType =
profile.ownedSettingLayers?.compatibilityProfile?.legacyTemplateWorldType;
if (
legacyTemplateWorldType === WorldType.WUXIA ||
legacyTemplateWorldType === WorldType.XIANXIA
) {
return legacyTemplateWorldType;
}
if (
profile.templateWorldType === WorldType.WUXIA ||
profile.templateWorldType === WorldType.XIANXIA
) {
return profile.templateWorldType;
}
const themeMode = detectCustomWorldThemeMode({
settingText: profile.settingText ?? '',
summary: profile.summary ?? '',
tone: profile.tone ?? '',
playerGoal: profile.playerGoal ?? '',
templateWorldType: profile.templateWorldType ?? WorldType.WUXIA,
compatibilityTemplateWorldType: profile.compatibilityTemplateWorldType,
ownedSettingLayers: profile.ownedSettingLayers,
});
return themeMode === 'arcane' ? WorldType.XIANXIA : WorldType.WUXIA;
}
export const resolveCustomWorldAnchorWorldType =
resolveCustomWorldCompatibilityTemplateWorldType;