This commit is contained in:
109
src/services/customWorldTheme.ts
Normal file
109
src/services/customWorldTheme.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user