110 lines
3.3 KiB
TypeScript
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;
|