Skip to content

Commit 66b8d5b

Browse files
committed
feat(bdsm): 连接BDSM核心工作流并完成全流程AI测试
- 在 useGame.ts 中接入 5 个核心 AI 函数(生成任务/指令/评价/契约/阶段推进) - 新增异步操作函数并通过 actions 导出到 UI 层 - CampusDesireDashboard 新增生成任务/刷新指令/阶段判定按钮 - BDSMRelationshipModal 接入接受/报告/放弃任务回调 - BDSMContractModal 接入契约生成/解除回调 - 修复触发器硬编码契约类型为"口头约定"的问题 - 修复日常指令中文字段名解析(Gemini 返回中文 key) - 统一阶段阈值常量到 bdsmConstants.ts,消除三处重复 - 编写 test_bdsm_workflow.ts 测试脚本,5/5 AI 调用测试通过
1 parent 6f1015f commit 66b8d5b

9 files changed

Lines changed: 839 additions & 39 deletions

File tree

App.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,6 +1620,15 @@ const App: React.FC = () => {
16201620
onOpenBDSMRelationship={(npcId, npcName) => setShowBDSMRelationship({ npcId, npcName })}
16211621
onOpenBDSMContract={(npcId, npcName) => setShowBDSMContract({ npcId, npcName })}
16221622
onOpenBDSMSafety={(npcId, npcName) => setShowBDSMSafety({ npcId, npcName })}
1623+
onGenerateTasks={(npcId, npcName) => {
1624+
void actions.requestBDSMTaskGeneration(npcId, npcName);
1625+
}}
1626+
onGenerateDailyInstructions={(npcId, npcName) => {
1627+
void actions.requestBDSMDailyInstructions(npcId, npcName);
1628+
}}
1629+
onCheckStageAdvance={(npcId, npcName) => {
1630+
void actions.requestBDSMStageAdvance(npcId, npcName);
1631+
}}
16231632
/>
16241633
)}
16251634
</懒加载边界>
@@ -1631,6 +1640,15 @@ const App: React.FC = () => {
16311640
npcName={showBDSMRelationship.npcName}
16321641
日常指令={(state as any).校园系统?.欲望系统?.NPC欲望档案?.[showBDSMRelationship.npcId]?.BDSM关系?.日常指令 ?? []}
16331642
onClose={() => setShowBDSMRelationship(null)}
1643+
onAcceptTask={(taskId) => {
1644+
actions.updateBDSMTaskStatus(showBDSMRelationship.npcId, taskId, '进行中');
1645+
}}
1646+
onReportComplete={(taskId, desc) => {
1647+
void actions.requestBDSMTaskEvaluation(showBDSMRelationship.npcId, taskId, desc || '已完成任务');
1648+
}}
1649+
onAbandonTask={(taskId) => {
1650+
actions.updateBDSMTaskStatus(showBDSMRelationship.npcId, taskId, '已放弃');
1651+
}}
16341652
onGoToContract={() => {
16351653
setShowBDSMRelationship(null);
16361654
setShowBDSMContract(showBDSMRelationship);
@@ -1646,6 +1664,22 @@ const App: React.FC = () => {
16461664
<BDSMContractModal
16471665
关系状态={(state as any).校园系统?.欲望系统?.NPC欲望档案?.[showBDSMContract.npcId]?.BDSM关系}
16481666
onClose={() => setShowBDSMContract(null)}
1667+
onNegotiateContract={() => {
1668+
void actions.requestBDSMContractGeneration(showBDSMContract.npcId, '书面契约');
1669+
}}
1670+
onDissolveContract={() => {
1671+
// 标记当前契约为已解除
1672+
const campusSystem = (state as any).校园系统;
1673+
const 档案 = campusSystem?.欲望系统?.NPC欲望档案?.[showBDSMContract.npcId];
1674+
if (档案?.BDSM关系?.契约记录?.length > 0) {
1675+
const 最后契约 = 档案.BDSM关系.契约记录[档案.BDSM关系.契约记录.length - 1];
1676+
actions.updateContractStatus(showBDSMContract.npcId, {
1677+
...最后契约,
1678+
状态: '已解除',
1679+
});
1680+
}
1681+
setShowBDSMContract(null);
1682+
}}
16491683
/>
16501684
)}
16511685

components/features/CampusDesireDashboard.tsx

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,12 @@ interface NPCDesireCardProps {
7171
onOpenBDSMRelationship?: (npcId: string, npcName: string) => void;
7272
onOpenBDSMContract?: (npcId: string, npcName: string) => void;
7373
onOpenBDSMSafety?: (npcId: string, npcName: string) => void;
74+
onGenerateTasks?: (npcId: string, npcName: string) => void;
75+
onGenerateDailyInstructions?: (npcId: string, npcName: string) => void;
76+
onCheckStageAdvance?: (npcId: string, npcName: string) => void;
7477
}
7578

76-
const NPCDesireCard: React.FC<NPCDesireCardProps> = ({ npcName, 档案, 后果, 里程碑数, npcId, onOpenBDSMRelationship, onOpenBDSMContract, onOpenBDSMSafety }) => {
79+
const NPCDesireCard: React.FC<NPCDesireCardProps> = ({ npcName, 档案, 后果, 里程碑数, npcId, onOpenBDSMRelationship, onOpenBDSMContract, onOpenBDSMSafety, onGenerateTasks, onGenerateDailyInstructions, onCheckStageAdvance }) => {
7780
const [expanded, setExpanded] = React.useState(false);
7881

7982
const 活跃后果 = useMemo(() => 后果.filter(c => !c.是否已解决), [后果]);
@@ -235,6 +238,35 @@ const NPCDesireCard: React.FC<NPCDesireCardProps> = ({ npcName, 档案, 后果,
235238
</button>
236239
)}
237240
</div>
241+
<div className="flex gap-2 mt-2">
242+
{onGenerateTasks && (
243+
<button
244+
type="button"
245+
onClick={(e) => { e.stopPropagation(); onGenerateTasks(npcId, npcName); }}
246+
className="flex-1 text-[11px] py-1.5 rounded bg-blue-900/20 border border-blue-500/30 text-blue-400 hover:bg-blue-900/40 transition-colors"
247+
>
248+
生成任务
249+
</button>
250+
)}
251+
{onGenerateDailyInstructions && (
252+
<button
253+
type="button"
254+
onClick={(e) => { e.stopPropagation(); onGenerateDailyInstructions(npcId, npcName); }}
255+
className="flex-1 text-[11px] py-1.5 rounded bg-cyan-900/20 border border-cyan-500/30 text-cyan-400 hover:bg-cyan-900/40 transition-colors"
256+
>
257+
刷新指令
258+
</button>
259+
)}
260+
{onCheckStageAdvance && (
261+
<button
262+
type="button"
263+
onClick={(e) => { e.stopPropagation(); onCheckStageAdvance(npcId, npcName); }}
264+
className="flex-1 text-[11px] py-1.5 rounded bg-amber-900/20 border border-amber-500/30 text-amber-400 hover:bg-amber-900/40 transition-colors"
265+
>
266+
阶段判定
267+
</button>
268+
)}
269+
</div>
238270
</div>
239271
)}
240272

@@ -280,6 +312,9 @@ interface Props {
280312
onOpenBDSMRelationship?: (npcId: string, npcName: string) => void;
281313
onOpenBDSMContract?: (npcId: string, npcName: string) => void;
282314
onOpenBDSMSafety?: (npcId: string, npcName: string) => void;
315+
onGenerateTasks?: (npcId: string, npcName: string) => void;
316+
onGenerateDailyInstructions?: (npcId: string, npcName: string) => void;
317+
onCheckStageAdvance?: (npcId: string, npcName: string) => void;
283318
}
284319

285320
export const CampusDesireDashboard: React.FC<Props> = ({
@@ -291,6 +326,9 @@ export const CampusDesireDashboard: React.FC<Props> = ({
291326
onOpenBDSMRelationship,
292327
onOpenBDSMContract,
293328
onOpenBDSMSafety,
329+
onGenerateTasks,
330+
onGenerateDailyInstructions,
331+
onCheckStageAdvance,
294332
}) => {
295333
const npcIds = Object.keys(NPC欲望档案);
296334

@@ -387,6 +425,9 @@ export const CampusDesireDashboard: React.FC<Props> = ({
387425
onOpenBDSMRelationship={onOpenBDSMRelationship}
388426
onOpenBDSMContract={onOpenBDSMContract}
389427
onOpenBDSMSafety={onOpenBDSMSafety}
428+
onGenerateTasks={onGenerateTasks}
429+
onGenerateDailyInstructions={onGenerateDailyInstructions}
430+
onCheckStageAdvance={onCheckStageAdvance}
390431
/>
391432
))}
392433
{npcIds.length === 0 && (

0 commit comments

Comments
 (0)