Skip to content

Commit a39015a

Browse files
committed
feat(story-module): 实现故事模块注册与编排系统
引入了一个可扩展的故事模块管理系统,以取代硬编码的模块集成方式。该系统实现了模块的集中注册、动态激活、参数提取和提示词组装。 - **核心基础设施**: - 在 `utils/storyModule` 中创建了 `StoryModule` 接口、`故事模块注册表` 和 `模块编排器`,用于定义、注册和管理所有故事模块。 - **模块注册**: - 为现有的 `campusNSFW` 和 `urbanDriverNSFW` 模块创建了独立的注册文件 (`modules/contemporary/.../registration.ts`)。 - 在应用入口 (`index.tsx`) 统一导入模块注册逻辑。 - **重构与适配**: - 将 `gameSettings` 中的设置规范化逻辑提取到独立的 `normalization.ts` 文件中。 - 补充了之前缺失的 `urbanDriverNSFW` 设置规范化逻辑。 此重构旨在提高代码的可维护性和可扩展性,为未来快速添加新的故事模块奠定基础,解决了原有多文件手动修改带来的高昂成本问题。
1 parent 4ea75a3 commit a39015a

12 files changed

Lines changed: 1291 additions & 3 deletions

File tree

docs/plans/现代纪元故事模块管理方案.md

Lines changed: 674 additions & 0 deletions
Large diffs are not rendered by default.

index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import ReactDOM from 'react-dom/client';
33
import './styles/tailwind.css';
44
import './styles/mobileDevice.css';
5+
import './modules/contemporary'; // 注册现代纪元故事模块
56
import App from './App';
67

78
const rootElement = document.getElementById('root');

models/campusNSFW/normalization.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// 校园 NSFW 设置规范化
2+
3+
import type { 校园NSFW设置 } from './index';
4+
import { 默认校园NSFW设置 } from './index';
5+
6+
const 读取布尔 = (value: unknown, fallback: boolean): boolean =>
7+
typeof value === 'boolean' ? value : fallback;
8+
9+
const 合法NSFW强度 = ['微暗', '暧昧', '露骨'] as const;
10+
const 合法露出强度 = ['关闭', '轻度', '中度', '深度'] as const;
11+
const 合法SM强度 = ['关闭', '轻度', '中度', '深度'] as const;
12+
const 合法桌游强度 = ['关闭', '轻度', '中度', '深度'] as const;
13+
const 合法校园祭强度 = ['关闭', '轻度', '中度', '深度'] as const;
14+
const 合法权力倾向 = ['随机', 'NPC支配', 'NPC服从', '切换者'] as const;
15+
const 合法活动频率 = ['关闭', '低', '中', '高'] as const;
16+
const 合法桌游频率 = ['低', '中', '高'] as const;
17+
const 合法校园祭频率 = ['每学期一次', '每学年一次', '随机'] as const;
18+
const 合法BDSM强度 = ['关闭', '轻度', '中度', '深度'] as const;
19+
20+
function 枚举校验<T extends string>(value: unknown, 合法值: readonly T[], fallback: T): T {
21+
return (合法值 as readonly string[]).includes(typeof value === 'string' ? value : '')
22+
? (value as T)
23+
: fallback;
24+
}
25+
26+
/**
27+
* 规范化校园 NSFW 设置:处理用户输入的类型转换和校验
28+
*/
29+
export function 规范化校园NSFW设置(raw: Partial<校园NSFW设置>): 校园NSFW设置 {
30+
const s = 默认校园NSFW设置;
31+
return {
32+
启用校园NSFW深化系统: 读取布尔(raw.启用校园NSFW深化系统, s.启用校园NSFW深化系统),
33+
NSFW内容强度: 枚举校验(raw.NSFW内容强度, 合法NSFW强度, s.NSFW内容强度),
34+
启用后果系统: 读取布尔(raw.启用后果系统, s.启用后果系统),
35+
启用多角关系: 读取布尔(raw.启用多角关系, s.启用多角关系),
36+
启用露出系统: 读取布尔(raw.启用露出系统, s.启用露出系统),
37+
露出内容强度: 枚举校验(raw.露出内容强度, 合法露出强度, s.露出内容强度),
38+
启用公开隐秘侵犯: 读取布尔(raw.启用公开隐秘侵犯, s.启用公开隐秘侵犯),
39+
启用旁观者反应: 读取布尔(raw.启用旁观者反应, s.启用旁观者反应),
40+
启用网络传播: 读取布尔(raw.启用网络传播, s.启用网络传播),
41+
校园活动NSFW频率: 枚举校验(raw.校园活动NSFW频率, 合法活动频率, s.校园活动NSFW频率),
42+
启用SM系统: 读取布尔(raw.启用SM系统, s.启用SM系统),
43+
SM内容强度: 枚举校验(raw.SM内容强度, 合法SM强度, s.SM内容强度),
44+
启用契约系统: 读取布尔(raw.启用契约系统, s.启用契约系统),
45+
启用公开服从: 读取布尔(raw.启用公开服从, s.启用公开服从),
46+
权力天平初始倾向: 枚举校验(raw.权力天平初始倾向, 合法权力倾向, s.权力天平初始倾向),
47+
启用桌游NSFW: 读取布尔(raw.启用桌游NSFW, s.启用桌游NSFW),
48+
桌游NSFW强度: 枚举校验(raw.桌游NSFW强度, 合法桌游强度, s.桌游NSFW强度),
49+
启用密室逃脱NSFW: 读取布尔(raw.启用密室逃脱NSFW, s.启用密室逃脱NSFW),
50+
启用狼人杀NSFW: 读取布尔(raw.启用狼人杀NSFW, s.启用狼人杀NSFW),
51+
启用剧本杀NSFW: 读取布尔(raw.启用剧本杀NSFW, s.启用剧本杀NSFW),
52+
启用派对游戏NSFW: 读取布尔(raw.启用派对游戏NSFW, s.启用派对游戏NSFW),
53+
桌游触发频率: 枚举校验(raw.桌游触发频率, 合法桌游频率, s.桌游触发频率),
54+
启用校园祭NSFW: 读取布尔(raw.启用校园祭NSFW, s.启用校园祭NSFW),
55+
校园祭NSFW强度: 枚举校验(raw.校园祭NSFW强度, 合法校园祭强度, s.校园祭NSFW强度),
56+
启用后夜祭告白: 读取布尔(raw.启用后夜祭告白, s.启用后夜祭告白),
57+
启用摊位NSFW: 读取布尔(raw.启用摊位NSFW, s.启用摊位NSFW),
58+
启用舞台NSFW: 读取布尔(raw.启用舞台NSFW, s.启用舞台NSFW),
59+
校园祭频率: 枚举校验(raw.校园祭频率, 合法校园祭频率, s.校园祭频率),
60+
启用BDSM论坛: 读取布尔(raw.启用BDSM论坛, s.启用BDSM论坛),
61+
BDSM内容强度: 枚举校验(raw.BDSM内容强度, 合法BDSM强度, s.BDSM内容强度),
62+
启用BDSM_NPC影响: 读取布尔(raw.启用BDSM_NPC影响, s.启用BDSM_NPC影响),
63+
启用BDSM_流言传播: 读取布尔(raw.启用BDSM_流言传播, s.启用BDSM_流言传播),
64+
启用BDSM关系管线: 读取布尔(raw.启用BDSM关系管线, s.启用BDSM关系管线),
65+
启用BDSM调教任务: 读取布尔(raw.启用BDSM调教任务, s.启用BDSM调教任务),
66+
启用BDSM契约系统: 读取布尔(raw.启用BDSM契约系统, s.启用BDSM契约系统),
67+
};
68+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// 都市网约车 NSFW 设置规范化
2+
3+
import type { 都市网约车NSFW设置 } from './index';
4+
import { 默认都市网约车NSFW设置 } from './index';
5+
6+
const 读取布尔 = (value: unknown, fallback: boolean): boolean =>
7+
typeof value === 'boolean' ? value : fallback;
8+
9+
const 合法NSFW强度 = ['微暗', '暧昧', '露骨'] as const;
10+
const 合法场景强度 = ['关闭', '轻度', '中度', '深度'] as const;
11+
const 合法后果严重度 = ['轻微', '中等', '严重', '毁灭'] as const;
12+
const 合法触发频率 = ['低', '中', '高'] as const;
13+
14+
function 枚举校验<T extends string>(value: unknown, 合法值: readonly T[], fallback: T): T {
15+
return (合法值 as readonly string[]).includes(typeof value === 'string' ? value : '')
16+
? (value as T)
17+
: fallback;
18+
}
19+
20+
/**
21+
* 规范化都市网约车 NSFW 设置
22+
*/
23+
export function 规范化都市网约车NSFW设置(raw: Partial<都市网约车NSFW设置>): 都市网约车NSFW设置 {
24+
const s = 默认都市网约车NSFW设置;
25+
return {
26+
启用都市网约车NSFW系统: 读取布尔(raw.启用都市网约车NSFW系统, s.启用都市网约车NSFW系统),
27+
NSFW内容强度: 枚举校验(raw.NSFW内容强度, 合法NSFW强度, s.NSFW内容强度),
28+
启用醉酒乘客场景: 读取布尔(raw.启用醉酒乘客场景, s.启用醉酒乘客场景),
29+
醉酒场景强度: 枚举校验(raw.醉酒场景强度, 合法场景强度, s.醉酒场景强度),
30+
启用饮料下药场景: 读取布尔(raw.启用饮料下药场景, s.启用饮料下药场景),
31+
下药场景强度: 枚举校验(raw.下药场景强度, 合法场景强度, s.下药场景强度),
32+
启用深夜独处场景: 读取布尔(raw.启用深夜独处场景, s.启用深夜独处场景),
33+
启用后座暗示场景: 读取布尔(raw.启用后座暗示场景, s.启用后座暗示场景),
34+
启用停车场秘密场景: 读取布尔(raw.启用停车场秘密场景, s.启用停车场秘密场景),
35+
启用拼车暧昧场景: 读取布尔(raw.启用拼车暧昧场景, s.启用拼车暧昧场景),
36+
启用常客关系系统: 读取布尔(raw.启用常客关系系统, s.启用常客关系系统),
37+
启用行车记录仪系统: 读取布尔(raw.启用行车记录仪系统, s.启用行车记录仪系统),
38+
启用后果系统: 读取布尔(raw.启用后果系统, s.启用后果系统),
39+
后果严重程度: 枚举校验(raw.后果严重程度, 合法后果严重度, s.后果严重程度),
40+
启用平台处罚: 读取布尔(raw.启用平台处罚, s.启用平台处罚),
41+
启用网络传播: 读取布尔(raw.启用网络传播, s.启用网络传播),
42+
启用警察盘查: 读取布尔(raw.启用警察盘查, s.启用警察盘查),
43+
启用勒索威胁: 读取布尔(raw.启用勒索威胁, s.启用勒索威胁),
44+
NSFW行程触发频率: 枚举校验(raw.NSFW行程触发频率, 合法触发频率, s.NSFW行程触发频率),
45+
};
46+
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// 校园 NSFW 模块注册
2+
3+
import type { StoryModule, 游戏状态快照 } from '../../../utils/storyModule/types';
4+
import { 故事模块注册表 } from '../../../utils/storyModule/registry';
5+
import type { 校园NSFW设置 } from '../../../models/campusNSFW';
6+
import { 默认校园NSFW设置 } from '../../../models/campusNSFW';
7+
import { 规范化校园NSFW设置 } from '../../../models/campusNSFW/normalization';
8+
import { 构建校园NSFW完整叙事约束 } from '../../../prompts/runtime/campusNSFW';
9+
import type { 露出偏好等级, 权力倾向, SM场景类型, 校园祭阶段, 校园祭主题, 摊位类型, 后夜祭状态, 桌游类型, 密室主题 } from '../../../models/campusNSFW';
10+
11+
interface 校园运行时参数 {
12+
欲望阶段: string;
13+
关系轨道: string;
14+
暴露风险: number;
15+
流言等级: number;
16+
露出偏好等级?: 露出偏好等级;
17+
紧张度?: number;
18+
权力倾向?: 权力倾向;
19+
服从度?: number;
20+
已解锁SM场景: SM场景类型[];
21+
校园祭阶段?: 校园祭阶段;
22+
校园祭主题?: 校园祭主题;
23+
摊位类型?: 摊位类型;
24+
后夜祭状态?: 后夜祭状态;
25+
桌游类型?: 桌游类型;
26+
密室主题?: 密室主题;
27+
内容强度: '微暗' | '暧昧' | '露骨';
28+
其他Npc欲望摘要?: string;
29+
启用BDSM论坛: boolean;
30+
BDSM内容强度: '关闭' | '轻度' | '中度' | '深度';
31+
论坛活跃帖子数?: number;
32+
寻主召奴未联系帖数?: number;
33+
}
34+
35+
function 提取校园参数(
36+
gameState: 游戏状态快照,
37+
settings: 校园NSFW设置
38+
): 校园运行时参数 | null {
39+
const 欲望系统 = (gameState.校园系统 as any)?.欲望系统;
40+
if (!欲望系统?.NPC欲望档案) return null;
41+
42+
const npcIds = Object.keys(欲望系统.NPC欲望档案);
43+
if (npcIds.length === 0) return null;
44+
45+
const 阶段权重: Record<string, number> = { '克制': 0, '试探': 1, '渴望': 2, '沉沦': 3, '支配': 4 };
46+
const 焦点NpcId = npcIds.reduce((best, id) => {
47+
const a = 欲望系统.NPC欲望档案[id];
48+
const b = 欲望系统.NPC欲望档案[best];
49+
return (阶段权重[a?.当前阶段] || 0) > (阶段权重[b?.当前阶段] || 0) ? id : best;
50+
});
51+
52+
const 焦点档案 = 欲望系统.NPC欲望档案[焦点NpcId];
53+
if (!焦点档案) return null;
54+
55+
const 其他Npc摘要: string[] = [];
56+
for (const id of npcIds) {
57+
if (id === 焦点NpcId) continue;
58+
const 档案 = 欲望系统.NPC欲望档案[id];
59+
if (!档案) continue;
60+
let 片段 = `${id}: ${档案.当前阶段}/${档案.关系轨道}(进度${档案.阶段进度}/${档案.轨道进度}) 暴露${档案.暴露风险值}`;
61+
if (档案.BDSM关系) {
62+
片段 += ` BDSM:${档案.BDSM关系.阶段}`;
63+
}
64+
其他Npc摘要.push(片段);
65+
}
66+
67+
const 已解锁SM场景: SM场景类型[] = (欲望系统.SM场景池 || []).map((r: any) => r.场景类型);
68+
69+
const 校园祭状态 = 欲望系统.校园祭状态;
70+
const 桌游 = 欲望系统.桌游状态;
71+
72+
return {
73+
欲望阶段: 焦点档案.当前阶段,
74+
关系轨道: 焦点档案.关系轨道,
75+
暴露风险: 焦点档案.暴露风险值,
76+
流言等级: 焦点档案.流言等级,
77+
露出偏好等级: 焦点档案.露出状态?.当前等级,
78+
紧张度: 焦点档案.紧张度状态?.当前值,
79+
权力倾向: 焦点档案.权力倾向,
80+
服从度: 焦点档案.服从度?.当前值,
81+
已解锁SM场景,
82+
校园祭阶段: 校园祭状态?.阶段,
83+
校园祭主题: 校园祭状态?.主题,
84+
摊位类型: 校园祭状态?.摊位类型,
85+
后夜祭状态: 校园祭状态?.后夜祭状态,
86+
桌游类型: 桌游?.当前类型,
87+
密室主题: (桌游 as any)?.密室主题,
88+
内容强度: settings.NSFW内容强度,
89+
其他Npc欲望摘要: 其他Npc摘要.length > 0 ? 其他Npc摘要.join(';') : undefined,
90+
启用BDSM论坛: settings.启用BDSM论坛,
91+
BDSM内容强度: settings.BDSM内容强度,
92+
论坛活跃帖子数: 0,
93+
寻主召奴未联系帖数: 0,
94+
};
95+
}
96+
97+
const 校园NSFW模块: StoryModule<校园NSFW设置, 校园运行时参数> = {
98+
id: 'campusNSFW',
99+
name: '校园NSFW',
100+
eraId: 'contemporary_urban',
101+
version: '2.0.0',
102+
priority: 100,
103+
category: 'nsfw',
104+
description: '校园纪元 NSFW 深化系统:欲望状态机、关系轨道、露出、SM、桌游、校园祭、BDSM 论坛等子系统',
105+
masterToggleKey: '启用校园NSFW深化系统',
106+
dependencies: [],
107+
defaultSettings: 默认校园NSFW设置,
108+
normalizeSettings: (raw) => 规范化校园NSFW设置(raw as Partial<校园NSFW设置>),
109+
extractPromptParams: 提取校园参数,
110+
buildPromptFragment: (params) => {
111+
return 构建校园NSFW完整叙事约束({
112+
欲望阶段: params.欲望阶段 as any,
113+
关系轨道: params.关系轨道 as any,
114+
暴露风险: params.暴露风险,
115+
流言等级: params.流言等级,
116+
露出偏好等级: params.露出偏好等级,
117+
紧张度: params.紧张度,
118+
权力倾向: params.权力倾向,
119+
服从度: params.服从度,
120+
已解锁SM场景: params.已解锁SM场景,
121+
校园祭阶段: params.校园祭阶段,
122+
校园祭主题: params.校园祭主题,
123+
摊位类型: params.摊位类型,
124+
后夜祭状态: params.后夜祭状态,
125+
桌游类型: params.桌游类型,
126+
密室主题: params.密室主题,
127+
内容强度: params.内容强度,
128+
其他Npc欲望摘要: params.其他Npc欲望摘要,
129+
启用BDSM论坛: params.启用BDSM论坛,
130+
BDSM内容强度: params.BDSM内容强度,
131+
论坛活跃帖子数: params.论坛活跃帖子数,
132+
寻主召奴未联系帖数: params.寻主召奴未联系帖数,
133+
});
134+
},
135+
responseTag: '欲望系统状态',
136+
};
137+
138+
故事模块注册表.注册模块(校园NSFW模块);

modules/contemporary/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// 现代纪元故事模块注册入口
2+
// 应用启动时导入一次,触发所有模块的自注册
3+
4+
import './campusNSFW/registration';
5+
import './urbanDriverNSFW/registration';
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// 都市网约车 NSFW 模块注册
2+
3+
import type { StoryModule, 游戏状态快照 } from '../../../utils/storyModule/types';
4+
import { 故事模块注册表 } from '../../../utils/storyModule/registry';
5+
import type { 都市网约车NSFW设置 } from '../../../models/urbanDriverNSFW';
6+
import { 默认都市网约车NSFW设置 } from '../../../models/urbanDriverNSFW';
7+
import { 规范化都市网约车NSFW设置 } from '../../../models/urbanDriverNSFW/normalization';
8+
import { 构建都市网约车完整叙事约束 } from '../../../prompts/runtime/urbanDriverNSFW';
9+
import type { 行程NSFW类型, 乘客欲望阶段, 行程关系轨道, 醉酒状态, 药物状态, 网约车后果类型 } from '../../../models/urbanDriverNSFW';
10+
11+
interface 网约车运行时参数 {
12+
行程类型?: 行程NSFW类型;
13+
乘客欲望阶段?: 乘客欲望阶段;
14+
关系轨道?: 行程关系轨道;
15+
暴露风险?: number;
16+
紧张度?: number;
17+
醉酒状态?: 醉酒状态;
18+
药物状态?: 药物状态;
19+
行车记录仪状态?: '关闭' | '录制中' | '已泄露';
20+
内容强度: '微暗' | '暧昧' | '露骨';
21+
后果?: { 类型: 网约车后果类型; 严重程度: '轻微' | '中等' | '严重' | '毁灭'; NPC信息?: string };
22+
}
23+
24+
function 提取网约车参数(
25+
gameState: 游戏状态快照,
26+
settings: 都市网约车NSFW设置
27+
): 网约车运行时参数 | null {
28+
const 行程系统 = (gameState.都市网约车系统 as any)?.行程系统;
29+
if (!行程系统) return null;
30+
31+
const 乘客档案 = 行程系统.乘客欲望档案;
32+
if (!乘客档案 || Object.keys(乘客档案).length === 0) return null;
33+
34+
const 首位乘客Id = Object.keys(乘客档案)[0];
35+
const 焦点档案 = 乘客档案[首位乘客Id];
36+
if (!焦点档案) return null;
37+
38+
return {
39+
行程类型: 行程系统.当前行程类型,
40+
乘客欲望阶段: 焦点档案.当前阶段,
41+
关系轨道: 焦点档案.关系轨道,
42+
暴露风险: 焦点档案.暴露风险值,
43+
紧张度: 焦点档案.紧张度?.当前值,
44+
醉酒状态: 焦点档案.醉酒状态,
45+
药物状态: 焦点档案.药物状态,
46+
行车记录仪状态: 行程系统.行车记录仪状态 ?? '关闭',
47+
内容强度: settings.NSFW内容强度,
48+
后果: 行程系统.后果列表?.length > 0
49+
? 行程系统.后果列表[0]
50+
: undefined,
51+
};
52+
}
53+
54+
const 都市网约车NSFW模块: StoryModule<都市网约车NSFW设置, 网约车运行时参数> = {
55+
id: 'urbanDriverNSFW',
56+
name: '都市网约车NSFW',
57+
eraId: 'contemporary_urban',
58+
version: '1.0.0',
59+
priority: 90,
60+
category: 'nsfw',
61+
description: '都市网约车 NSFW 深化系统:乘客欲望状态机、行程场景、醉酒/下药、行车记录仪、后果系统',
62+
masterToggleKey: '启用都市网约车NSFW系统',
63+
dependencies: [],
64+
defaultSettings: 默认都市网约车NSFW设置,
65+
normalizeSettings: (raw) => 规范化都市网约车NSFW设置(raw as Partial<都市网约车NSFW设置>),
66+
extractPromptParams: 提取网约车参数,
67+
buildPromptFragment: (params) => {
68+
return 构建都市网约车完整叙事约束({
69+
行程类型: params.行程类型,
70+
乘客欲望阶段: params.乘客欲望阶段,
71+
关系轨道: params.关系轨道,
72+
暴露风险: params.暴露风险,
73+
紧张度: params.紧张度,
74+
醉酒状态: params.醉酒状态,
75+
药物状态: params.药物状态,
76+
行车记录仪状态: params.行车记录仪状态,
77+
内容强度: params.内容强度,
78+
后果: params.后果,
79+
});
80+
},
81+
responseTag: '都市网约车系统状态',
82+
};
83+
84+
故事模块注册表.注册模块(都市网约车NSFW模块);

utils/gameSettings.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import { 获取酒馆预设顺序, 规范化酒馆预设 } from './tavernPreset'
55
import { resolveEraNode } from '../models/eraTheme';
66
import type { 校园NSFW设置 } from '../models/campusNSFW';
77
import { 默认校园NSFW设置 } from '../models/campusNSFW';
8+
import type { 都市网约车NSFW设置 } from '../models/urbanDriverNSFW';
9+
import { 默认都市网约车NSFW设置 } from '../models/urbanDriverNSFW';
10+
import { 规范化校园NSFW设置 } from '../models/campusNSFW/normalization';
11+
import { 规范化都市网约车NSFW设置 } from '../models/urbanDriverNSFW/normalization';
812

913
const 最低字数要求 = 50;
1014

@@ -185,7 +189,8 @@ export const 默认游戏设置: 游戏设置结构 = {
185189
酒馆预设名称: '',
186190
独立APIGPT模式: 默认独立APIGPT模式设置,
187191
额外提示词: 默认额外系统提示词,
188-
校园NSFW设置: 默认校园NSFW设置
192+
校园NSFW设置: 默认校园NSFW设置,
193+
都市网约车NSFW设置: 默认都市网约车NSFW设置
189194
};
190195

191196
export const 解析酒馆预设角色ID = (
@@ -302,7 +307,10 @@ export const 规范化游戏设置 = (
302307
),
303308
额外提示词: 规范化额外提示词(source.额外提示词, fallback.额外提示词),
304309
校园NSFW设置: (source.校园NSFW设置 && typeof source.校园NSFW设置 === 'object')
305-
? source.校园NSFW设置 as 校园NSFW设置
306-
: fallback.校园NSFW设置
310+
? 规范化校园NSFW设置(source.校园NSFW设置 as Partial<校园NSFW设置>)
311+
: fallback.校园NSFW设置,
312+
都市网约车NSFW设置: (source.都市网约车NSFW设置 && typeof source.都市网约车NSFW设置 === 'object')
313+
? 规范化都市网约车NSFW设置(source.都市网约车NSFW设置 as Partial<都市网约车NSFW设置>)
314+
: fallback.都市网约车NSFW设置
307315
};
308316
};

utils/storyModule/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// 故事模块管理系统 — 统一导出
2+
3+
export type { StoryModule, 游戏状态快照 } from './types';
4+
export { 故事模块注册表 } from './registry';
5+
export type { 模块运行时上下文 } from './orchestrator';
6+
export {
7+
初始化模块编排,
8+
提取模块参数,
9+
构建故事模块提示词,
10+
} from './orchestrator';

0 commit comments

Comments
 (0)