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;